バイナリ istream をバイトごとに読み取る 質問する

バイナリ istream をバイトごとに読み取る 質問する

私は、ifstream を使用してバイナリ ファイルをバイト単位で読み取ろうとしていました。これまでは、get() などの istream メソッドを使用して、バイナリ ファイルのチャンク全体を一度に問題なく読み取ってきました。しかし、現在のタスクでは、バイト単位で読み取って、IO システムのバッファリングを利用して効率化を図っています。問題は、ファイルの終わりに、本来よりも数バイト早く到達したように見えることです。そこで、次のテスト プログラムを作成しました。

#include <iostream>
#include <fstream>

int main() {
    typedef unsigned char uint8;
    std::ifstream source("test.dat", std::ios_base::binary);
    while (source) {
        std::ios::pos_type before = source.tellg();
        uint8 x;
        source >> x;
        std::ios::pos_type after = source.tellg();
        std::cout << before << ' ' << static_cast<int>(x) << ' '
                  << after << std::endl;
    }
    return 0;
}

これは、test.dat の内容を 1 行に 1 バイトずつダンプし、前後のファイルの位置を表示します。

確かに、ファイルに 2 バイトのシーケンス 0x0D-0x0A (キャリッジ リターンとライン フィードに対応) が含まれている場合、それらのバイトはスキップされます。

  • ストリームをバイナリ モードで開きました。これにより、行区切りが解釈されなくなるのではないでしょうか。
  • 抽出演算子は常にテキスト モードを使用しますか?
  • バイナリ istream からバイトごとに読み取る正しい方法は何ですか?

Windows 上の MSVC++ 2008。

ベストアンサー1

>>抽出子はフォーマットされた入力用です。空白はスキップされます(デフォルト)。1文字のフォーマットされていない入力の場合は、istream::get()(int読み取りが失敗した場合は EOF を返し、それ以外の場合は範囲​​ [0,UCHAR_MAX] 内の値を返します) またはistream::get(char&)(読み取った文字を引数に入れて、 に変換する何かを返しますbool。読み取りが成功した場合は true、失敗した場合は false を返します。

おすすめ記事