C++ stream のエラーコード2010年09月12日 12時19分32秒

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 になっている。