simotin13's message

simotin13といいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

どうすれば c++ の eof に対する違和感を抑えることができるのか?

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)としてこんなデータを用意してみます。

f:id:simotin13:20170217231956j:plain

出力


$ 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の挙動は同じです。

stackoverflow.com

stackoverflow.com


知らなかった・・・


C言語でもfgetcとかfgetsとか使うとループは終端まで読み込んでからEOFと比較するようなコードになります。

う~ん・・・C++ の eosの挙動もC言語の挙動との類似性を意識したものかもしれませんがどうもしっくりしません。