C++でバイナリファイルの読み込みをしたいとき、ソースコードはこんな感じか。
#include <stdio.h> #include <iostream> #include <fstream> using namespace std; int main(int argc, char **argv) { string filePath = "test.bin"; ifstream fin( filePath.c_str(), ios::in | ios::binary ); if (fin) { unsigned char c; while(!fin.eof()) { fin.read( ( char * ) &c, sizeof(unsigned char)); printf("[0x%02X]", c); } fin.close(); } else { return -1; } return 0; }
↓読み込むデータ(上記コードのtest.bin)としてこんなデータを用意してみます。
出力
$ g++ main.cpp
$ ./a.exe
[0x00][0x01][0x02][0x03][0x04][0x05][0x06][0x07][0x08][0x09][0x0A][0x0B][0x0C][0x0D][0x0E][0xFF][0xFF]
おー!読めてる読めて、うん!?
[0xFF]が1個多い!?
何が起こってるんだ!?
調べたところ、eosはストリームの読み込みを行った上でファイルの終端に達したかを返してくれるそうです。
※上記コードはバイナリファイルの読み込みをしていますが、テキストファイルでもeosの挙動は同じです。
知らなかった・・・
C言語でもfgetcとかfgetsとか使うとループは終端まで読み込んでからEOFと比較するようなコードになります。