Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Successfully open but not good?

Tags:

c++

file

stream

In C++, is there a case where std::ifstream open() can be successful, but std::ifstream good() can be false ?

EDIT : tested with g++ 4.7.1

#include <iostream>
#include <fstream>
int main(int argc, char *argv[])
{
    std::ifstream filestream("testfile");
    std::cout<<filestream.good()<<std::endl;
    std::cout<<filestream.eof()<<std::endl;
    std::cout<<filestream.fail()<<std::endl;
    std::cout<<filestream.bad()<<std::endl;
    return 0;
}

will return : 1, 0, 0, 0 for an empty file which means good = TRUE and eof = fail = bad = FALSE. Is it normal ?

like image 254
Vincent Avatar asked Sep 27 '12 16:09

Vincent


1 Answers

After verifying the actual text in the standard, I don't think eofbit is allowed to be set after an open: badbit may be set if the actual open throws an exception (I think—the standard doesn't really say what should happen in this case); failbit should be set if the open fails, or if the seek after the open (if ate is set) fails; but there doesn't seem to be any case where eofbit may be set.

Not that calling std::istream::good() is a good solution in this case. (It would be interesting to know what the OP is trying to achieve. Whatever it is, calling std::istream::good() is probably not the right solution.)

If std::ifstream::good() returns false, the next input will fail. If it returns true, it tells you nothing: the next input may succeed, but it might also fail.

like image 67
James Kanze Avatar answered Sep 28 '22 12:09

James Kanze