C++ でのファイルへのビットの読み取りと書き込み
C++ では、テキスト ファイルの圧縮などのプロセスで、ビットの読み取りとファイルへの書き込みが必要になります。 このチュートリアルでは、C++ でエラーなしでファイルのビットを読み書きする方法を学習します。
istream
と ostream
は、デストラクタとして、ファイルのビットの読み取りと書き込みが必要な場合に重要な役割を果たします。
ただし、Huffman
コーディングで Huffman
ツリーを介してエンコードする際にビットをバイナリ出力ファイルに書き込む必要がある場合があります。ストリームを使用する代わりに、ブール値を 8 ビットのチャンクにパックしてからバイトを書き込むことができます。
iStream
と oStream
を使用して C++ でファイルのビットを読み書きする
BitInputStream
クラスには、ビットを読み書きするための iStream
および oStream
機能が含まれています。 ifstream
と ofstream
はストリームを物理ファイル名に付けることでバイナリ ファイルを開くことができるため、ファイルのビットを読み書きするためにも重要です。
さらに、ターゲット BitInputStream
クラスのオープン メンバー関数は、一般的に記述されていない引数 (オプションの引数) を提供できます。
ostream
は、メモリ位置から n
バイトを書き込み、n
バイトの前にポインターを転送するオープン メンバー関数の 1つです。
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
一般に、C++ では cin
と cout
は 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