Reputation: 10959
std::fstream fin("emptyFile", std::fstream::in);
std::cout << fin.eof() << std::endl;
This prints 0
. So using eof
function I can't check if file is empty. Or after reading some data I need to check if there is no more data in it.
Upvotes: 3
Views: 11261
Reputation: 129344
There are two ways to check if you "can read something" from a file:
fin >> var;
)fin.seekg(0, ios_base::end);
followed by size_t len = fin.tellg();
(and then move back to the beginning with fin.seekg(0, ios_base::beg);
)However, if you are trying to read an integer from a text-file, the second method may not work - the file could be 2MB long, and still not contain a single integer value, because it's all spaces and newlines, etc.
Note that fin.eof()
tells you if there has been an attempt to read BEYOND the end of the file.
Upvotes: 3
Reputation: 4411
eof()
gives you the wrong result because eofbit
is not set yet. If you read something you will pass the end of the file and eofbit
will be set.
Avoid eof()
and use the following:
std::streampos current = fin.tellg();
fin.seekg (0, fin.end);
bool empty = !fin.tellg(); // true if empty file
fin.seekg (current, fin.beg); //restore stream position
Upvotes: 1