C++에서 파일에 대한 비트 읽기 및 쓰기
C++에서 텍스트 파일의 압축과 같은 프로세스는 비트를 읽고 파일에 써야 합니다. 이 자습서에서는 C++에서 오류 없이 파일에 비트를 읽거나 쓰는 방법을 배웁니다.
소멸자로서의 istream
및 ostream
은 파일에서 비트를 읽고 쓸 때 중요한 역할을 합니다.
그러나 Huffman
코딩에서 Huffman
트리를 통해 인코딩하는 동안 이진 출력 파일에 비트를 써야 할 수 있으며 스트림을 사용하는 대신 부울을 8비트 청크로 묶은 다음 바이트를 쓸 수 있습니다.
iStream
및 oStream
을 사용하여 C++에서 파일에 대한 비트 읽기 및 쓰기
BitInputStream
클래스에는 비트를 읽고 쓰는 iStream
및 oStream
기능이 포함되어 있습니다. ifstream
및 ofstream
은 물리적 파일 이름에 스트림을 첨부하여 이진 파일을 열 수 있으므로 파일에서 비트를 읽거나 쓰는 데에도 중요합니다.
또한 대상 BitInputStream
클래스의 공개 멤버 함수는 공통적으로 설명되지 않은 인수(선택적 인수)를 제공할 수 있습니다.
ostream
은 n
바이트가 메모리 위치에서 쓰여지고 n
바이트 앞에 있는 포인터를 전송하는 열린 멤버 함수 중 하나입니다.
fstream
스트림 클래스는 파일에서 읽고 쓸 수 있기 때문에 다른 스트림 클래스보다 기능이 뛰어납니다.
파일 스트림이 바이너리 모드에서 열리기 때문에 바이너리에서 작업을 읽고 쓰는 것은 중요하지 않습니다. 대신 모든 형태의 읽기/쓰기 작업을 수행할 수 있습니다.
#include <fstream>
#include <iostream> // reflects `istream` and `ostream`
// optional
using namespace std;
// struct declaration
struct army_per {
// an entity that reflects three attributes
int ref_no;
string rank, name;
};
// primary class
int main() {
// declaration of `ofstream` for read/write `army_per` file
ofstream wf("army_per.dat", ios::out | ios::binary);
if (!wf) {
cout << "Unable to open the file!" << endl;
return 1;
}
// entity declaration
army_per soldier[2];
// first entry
soldier[0].ref_no = 1;
soldier[0].name = "Rob";
soldier[0].rank = "Captain";
// second entry
soldier[1].ref_no = 2;
soldier[1].name = "Stannis";
soldier[1].rank = "Major";
for (int i = 0; i < 2; i++) wf.write((char *)&soldier[i], sizeof(army_per));
wf.close();
if (!wf.good()) {
cout << "Error: bits writing time error!" << endl;
return 1;
}
ifstream rf("army_per.dat", ios::out | ios::binary);
if (!rf) {
cout << "File is not found!" << endl;
return 1;
}
army_per rstu[2];
for (int i = 0; i < 2; i++) rf.read((char *)&rstu[i], sizeof(army_per));
rf.close();
if (!rf.good()) {
cout << "Error: bits reading time error occured!" << endl;
return 1;
}
cout << "Army Div-32 details:" << endl;
for (int i = 0; i < 2; i++) {
// access the elements of the object and output the result of each
// individual
cout << "Reference No: " << soldier[i].ref_no << endl;
cout << "Name: " << soldier[i].name << endl;
cout << "Rank: " << soldier[i].rank << endl;
cout << endl;
}
return 0;
}
출력:
Army Div-32 details:
Reference No: 1
Name: Rob
Rank: Captain
Reference No: 2
Name: Stannis
Rank: Major
일반적으로 cin
과 cout
은 C++에서 ostream
에 속하지만 cin
개체(전역 개체)는 istream
클래스에 속합니다.
또한 파일 스트림에는 다음이 포함됩니다. ifstream
및 ofstream
은 각각 istream
및 ostream
에서 상속됩니다.
프로그래머는 버퍼가 항상 보유해야 하는 데이터보다 크다는 사실을 알고 있어야 합니다. C++에서는 확인되지 않거나 해결된 오류의 경우 프로그램의 안정성이 감소할 가능성이 높아질 수 있으며 파일 작업으로 인해 프로그램이 중지되지 않도록 해야 합니다.
Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.
GitHub