C++ でのファイルへのビットの読み取りと書き込み

Syed Hassan Sabeeh Kazmi 2023年10月12日
C++ でのファイルへのビットの読み取りと書き込み

C++ では、テキスト ファイルの圧縮などのプロセスで、ビットの読み取りとファイルへの書き込みが必要になります。 このチュートリアルでは、C++ でエラーなしでファイルのビットを読み書きする方法を学習します。

istreamostream は、デストラクタとして、ファイルのビットの読み取りと書き込みが必要な場合に重要な役割を果たします。

ただし、Huffman コーディングで Huffman ツリーを介してエンコードする際にビットをバイナリ出力ファイルに書き込む必要がある場合があります。ストリームを使用する代わりに、ブール値を 8 ビットのチャンクにパックしてからバイトを書き込むことができます。

iStreamoStream を使用して C++ でファイルのビットを読み書きする

BitInputStream クラスには、ビットを読み書きするための iStream および oStream 機能が含まれています。 ifstreamofstream はストリームを物理ファイル名に付けることでバイナリ ファイルを開くことができるため、ファイルのビットを読み書きするためにも重要です。

さらに、ターゲット 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++ では cincoutostream に属すると考えられていますが、cin オブジェクトは (グローバル オブジェクトとして) istream クラスに属します。

さらに、以下を含むファイルストリーム。 ifstreamofstream は、それぞれ istreamostream から継承されます。

プログラマーは、バッファーが保持するデータよりも常に大きいことに注意する必要があります。 C++ では、エラーがチェックされていないか解決されていない場合に、プログラムの信頼性が低下する可能性が高くなり、ファイル操作によってプログラムが停止しないようにします。

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

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

関連記事 - C++ File