ifstream を使用してバイナリ ファイルをバイト単位で読み取ろうとしました。以前に get() のような istream メソッドを使用して、バイナリ ファイルのチャンク全体を問題なく一度に読み取ったことがあります。しかし、私の現在のタスクは、バイトごとに進み、io-system のバッファリングに依存して効率化することに適しています。問題は、本来よりも数バイト早くファイルの終わりに到達したように見えることです。そこで、次のテストプログラムを書きました。
#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。