C++ のストリームのエラーがとても分りづらい。good と fail は正反対の関係では無いのだ。そこで例を取り上げて試してみる。
#include <sstream>
#include <iostream>
void status(const char *when, const std::stringstream &s)
{
std::cout << "checking state "
<< when
<< ":"
<< " good = " << s.good()
<< " bad = " << s.bad()
<< " eof = " << s.eof()
<< " fail = " << s.fail()
<< std::endl;
}
int parse(const char *buf)
{
int value;
std::stringstream ss(buf);
status("Before read", ss);
ss >> value;
status("After read", ss);
return value;
}
int main()
{
parse("3");
parse("");
return 0;
}
最初は、数字を読み込む。そして、次は意図的に読み込みを失敗させる。
checking state Before read: good = 1 bad = 0 eof = 0 fail = 0
checking state After read: good = 0 bad = 0 eof = 1 fail = 0
checking state Before read: good = 1 bad = 0 eof = 0 fail = 0
checking state After read: good = 0 bad = 0 eof = 1 fail = 1
読んだ後は、両方とも good() が 0 になっている。既に eof に着いたからだ。最初の方は読み込みに問題が無いので fail() が 0 に、しかし二つ目は読み込みが失敗したので、fail() が 1 になっている。
セコメントをする