C++로 바이너리 파일 작성

C Lo Baineoli Pail Jagseong



C++ 프로그래밍에서 바이너리 파일을 처리하는 것은 원시 데이터를 저장하고 조작하는 데 필수적입니다. 이미지, 오디오 파일, 사용자 정의 데이터 구조 등 어떤 작업을 하든 바이너리 파일을 효율적으로 작성하는 능력은 매우 중요합니다. 바이너리 파일은 사람이 읽을 수 없는 형식으로 데이터를 저장하므로 복잡한 구조, 이미지 또는 간단한 텍스트 기반 표현을 따르지 않는 데이터를 저장하는 등 다양한 애플리케이션에 적합합니다.

C++에서는 이진 데이터를 쓰기 위해 이진 파일, 특히 “ofstream” 클래스와 상호 작용하는 라이브러리를 제공합니다. 이 기능을 통해 개발자는 바이너리 파일을 원활하게 생성, 수정 및 관리할 수 있습니다. 이 기사에서는 C++로 바이너리 파일을 작성하는 다양한 방법과 기법을 살펴보고 해당 애플리케이션과 사용 사례를 조명합니다.

C++를 사용하여 바이너리 파일 작성

C++를 사용하여 데이터를 바이너리 파일에 저장하려면 write() 메서드가 사용됩니다. 이 함수는 'put' 포인터 위치에서 시작하여 지정된 스트림에 지정된 바이트 수를 씁니다. 'put' 포인터가 끝에 있으면 파일이 확장됩니다. 그러나 포인터가 파일 내에 있으면 새 데이터가 기존 문자를 덮어씁니다. 쓰기 과정에서 오류가 발생하는 경우 스트림은 오류 상태로 표시됩니다. 이제 몇 가지 간단하고 내장된 C++ 함수를 사용하여 바이너리 파일을 작성하는 방법을 알아보기 위해 예제를 살펴보겠습니다.







방법 1: 구조화된 데이터로 바이너리 파일 작성

많은 경우 사용자 정의 구조와 같은 구조화된 데이터를 바이너리 파일에 작성해야 할 수도 있습니다. 사람의 이름, 키, 나이가 포함된 사람의 기록이 포함된 예를 생각해 보겠습니다. 다음 주어진 코드를 보고 설명을 살펴보세요.



#include

#include

구조체 사람 {

이름 [ 오십 ] ;

정수 나이 ;

더블 ;

} ;

정수 기본 ( ) {

성병 :: 스트림의 파일 출력 ( '사람.빈' , 성병 :: iOS :: 바이너리 ) ;

만약에 ( ! outFile. is_open ( ) ) {

성병 :: 세르 << '오류! 쓰기 위해 파일을 열 수 없습니다!' << 성병 :: ;

반품 1 ;

}

사람 사람1 = { '칼룸 일리아스' , 25 , 1.75 } ;

사람 사람2 = { '칼숨 바좌' , 30 , 1.68 } ;

outFile. 쓰다 ( 재해석_캐스트 < *> ( & 사람 1 ) , 크기 ( 사람 1 ) ) ;

outFile. 쓰다 ( 재해석_캐스트 < *> ( & 사람2 ) , 크기 ( 사람2 ) ) ;

outFile. 닫다 ( ) ;

성병 :: 시합 << '그 사람의 기록이 바이너리 파일에 성공적으로 기록되었습니다.' << 성병 :: ;

반품 0 ;

}

다음은 구체적인 세부정보가 포함된 코드 분석입니다. 프로그램은 'Person'이라는 사용자 정의 구조를 정의하는 것으로 시작됩니다. 여기에는 이름, 나이, 키의 세 가지 필드가 있습니다. 해당 필드의 세부정보는 다음과 같습니다.



  • 이름: 사람의 이름을 저장할 문자열(최대 50자)
  • 나이: 사람의 나이를 저장할 정수
  • 키: 사람의 키를 저장하는 double

'Person' 구조를 정의한 후 프로그램의 진입점인 주요 기능이 시작됩니다. 메인 프로그램의 첫 번째 줄은 'people.bin'이라는 파일을 엽니다. 우리는 'std::ofstream'을 사용하여 바이너리 형식으로 데이터를 쓰기 위해 'people.bin'이라는 파일을 생성합니다. 파일이 성공적으로 열리는지 확인하는 것은 매우 중요합니다. 그렇지 않으면 오류 메시지가 표시되고 프로그램이 중지됩니다. 따라서 'if' 조건과 is_open() 함수를 사용하여 파일이 성공적으로 열렸는지 여부를 확인합니다.





여기서는 두 개의 'Person' 개체가 생성됩니다. 'Person' 유형의 'person1'과 'person2'라는 두 개의 변수를 정의합니다. “Kalsoom Ilyas”와 “Kalsoom Bajwa”에 변수 이름, 나이, 키 값을 할당합니다.

이제 바이너리 파일에 쓸 데이터가 생겼으니 write() 함수로 실제 함수를 수행해 보겠습니다. 'outFile.write'를 사용하여 각 'Person' 개체의 내용을 파일에 씁니다. 'reinterpret_cast(&person1)' 및 'reinterpret_cast(&person2)'는 전체 'Person' 구조(모든 필드 포함)를 바이너리 파일에 쓰기에 적합한 연속 바이트 스트림으로 변환합니다. . 모든 데이터가 올바르게 작성되었는지 확인하기 위해 'sizeof(person1)' 및 'sizeof(person2)'를 사용하여 각 'Person' 개체의 크기를 작성합니다.



파일에 데이터를 쓴 후에는 다른 기능으로 인해 데이터가 손실되지 않도록 올바르게 닫는 것이 매우 중요합니다. outFile.close()를 사용하여 파일과 연결된 리소스를 해제하고 데이터가 정확하게 기록되었는지 확인합니다. 마지막으로 데이터가 바이너리 파일에 성공적으로 기록되었음을 확인하는 메시지를 인쇄합니다.

이 예를 더 간단한 용어로 설명한다면, 비밀 언어로 된 사람에 대한 정보만 저장할 수 있는 특별한 노트북을 상상해 보세요. 이 코드는 정보(이름, 나이, 키)를 정리하기 위한 청사진을 생성합니다. 노트를 열어 두 사람의 프로필을 작성하고, 그 정보를 비밀 언어로 번역해 그 안에 깔끔하게 적는다. 그런 다음 노트북을 안전하게 닫고 나중에 사용할 수 있도록 프로필을 보존합니다. 다음 스냅샷에 제공된 프로그램의 출력을 참조하세요.

방법 2: 바이너리 파일에 정수 쓰기

이 방법에서는 정수 배열이 'integers.bin'이라는 이진 파일에 기록됩니다. 'reinterpret_cast'는 정수 배열을 파일에 쓰기 위한 일련의 문자(바이트)로 처리합니다. 바이너리 파일이 원시 바이트 데이터를 처리하므로 이는 특히 중요합니다. 다음의 간단한 예를 살펴보겠습니다.

#include

#include

정수 기본 ( ) {

성병 :: 스트림의 파일 출력 ( '정수.bin' , 성병 :: iOS :: 바이너리 ) ;

만약에 ( ! outFile. is_open ( ) ) {

성병 :: 세르 << '오류! 쓰기 위해 파일을 열 수 없습니다!' << 성병 :: ;

반품 1 ;

}

정수 숫자 [ ] = { 42 , 99 , - 1 , 0 } ;

outFile. 쓰다 ( 재해석_캐스트 < *> ( 숫자 ) , 크기 ( 숫자 ) ) ;

outFile. 닫다 ( ) ;

성병 :: 시합 << '주어진 정수가 바이너리 파일에 성공적으로 기록되었습니다.' << 성병 :: ;

반품 0 ;

}

구체적인 세부 정보가 포함된 코드 분석은 다음과 같습니다.

'#include ' 및 '#include '은 각각 cin 및 write()와 같은 파일 작업 및 메시지 인쇄에 필요한 도구를 가져옵니다. 'std::ofstream outFile('integers.bin', std::ios::binary);' 비밀 코드(바이너리 형식)로만 숫자를 저장할 수 있는 'integers.bin'이라는 바이너리 파일을 엽니다. 파일이 열려 있는지 확인합니다. 그렇지 않으면 오류 메시지가 표시됩니다.

다음 줄은 'int number[] = {42, 99, -1, 0};'입니다. 정수 42, 99, -1 및 0을 사용하여 'numbers'라는 배열을 정의합니다. 'outFile.write(reinterpret_cast(numbers), sizeof(numbers));' 정수를 바이너리 형식으로 조심스럽게 변환하고 'integer.bin' 파일에 씁니다. 'outFile.close();' 정수를 안전하고 체계적으로 유지하기 위해 파일을 올바르게 닫습니다. 마지막으로 정수가 이진 파일에 성공적으로 저장되었음을 확인하는 메시지가 인쇄됩니다. 결과를 보려면 이 프로그램의 다음 출력을 참조하세요.

결론

C++로 바이너리 파일을 작성하는 것은 다양한 유형의 데이터를 효율적으로 처리하는 데 중요한 기술입니다. C++로 바이너리 파일을 작성하는 이번 탐구에서 우리는 'ofstream' 클래스를 사용하여 바이너리 데이터를 효율적으로 처리하는 방법을 배웠습니다. 간단한 정수를 처리하든 사용자 정의 구조를 사용하여 구조화된 데이터를 처리하든 프로세스에는 파일 스트림 열기, 이진 형식으로 데이터 쓰기, 파일 닫기가 포함됩니다. 이 기능은 C++ 개발자에게 다양한 범위의 이진 데이터 유형으로 작업할 수 있는 유연성을 제공하여 시스템 수준 프로그래밍에서 멀티미디어 처리에 이르는 응용 프로그램에서 언어의 다양성에 기여합니다.