Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 바이너리 파일 작성하기: write() 메서드 활용법

C++에서 바이너리 파일을 작성하려면 write() 메서드를 사용합니다. 이 메서드는 'put' 포인터가 가리키는 위치부터 시작하여 지정된 스트림에 주어진 바이트 수만큼 데이터를 기록하는 역할을 합니다.

put 포인터가 파일의 끝에 위치해 있다면 파일이 자동으로 확장되어 새 데이터가 추가됩니다. 반면 포인터가 파일 중간을 가리키고 있다면 해당 위치의 기존 데이터가 새 데이터로 덮어써집니다. 또한 파일 쓰기 도중 오류가 발생하면 스트림은 에러 상태로 전환됩니다.

write() 메서드 문법

ostream& write(const char*, int);

알고리즘

시작
    변수를 선언하기 위한 Student 구조체를 생성한다.
    바이너리 파일을 쓰기 모드로 연다.
    파일 열기 과정에서 오류가 발생했는지 확인한다.
    변수를 데이터로 초기화한다.
    파일이 성공적으로 열렸다면 write() 메서드로 바이너리 데이터를 기록한다.
    쓰기가 끝나면 파일을 닫는다.
    오류 발생 여부를 확인한다.
    데이터를 출력한다.
끝.

다음은 실제 동작 예제입니다.

예제 코드

#include<iostream>
#include<fstream>
using namespace std;
struct Student {
   int roll_no;
   string name;
};
int main() {
   ofstream wf("student.dat", ios::out | ios::binary);
   if(!wf) {
      cout << "Cannot open file!" << endl;
      return 1;
   }
   Student wstu[3];
   wstu[0].roll_no = 1;
   wstu[0].name = "Ram";
   wstu[1].roll_no = 2;
   wstu[1].name = "Shyam";
   wstu[2].roll_no = 3;
   wstu[2].name = "Madhu";
   for(int i = 0; i < 3; i++)
      wf.write((char *) &wstu[i], sizeof(Student));
   wf.close();
   if(!wf.good()) {
      cout << "Error occurred at writing time!" << endl;
      return 1;
   }
   cout<<"Student's Details:"<<endl;
   for(int i=0; i < 3; i++) {
      cout << "Roll No: " << wstu[i].roll_no << endl;
      cout << "Name: " << wstu[i].name << endl;
      cout << endl;
   }
   return 0;
}

위 코드에서는 ofstream 객체를 생성할 때 ios::outios::binary 플래그를 함께 지정하여 파일을 바이너리 쓰기 모드로 열었습니다. 이후 write() 메서드에 구조체 객체의 주소를 char* 타입으로 캐스팅하여 전달하고, sizeof(Student)로 구조체 크기만큼의 데이터를 한 번에 기록합니다.

실행 결과

Student’s Details:
Roll No: 1
Name: Ram
Roll No: 2
Name: Shyam
Roll No: 3
Name: Madhu

이처럼 write() 메서드를 활용하면 구조체와 같은 복합 데이터를 텍스트 변환 없이 그대로 파일에 저장할 수 있어, 데이터 입출력 속도가 빠르고 저장 공간도 효율적으로 사용할 수 있습니다.