I'm need to know if the next char in ifstream
is the end of file. I'm trying to do this with .peek()
:
if (file.peek() == -1)
and
if (file.peek() == file.eof())
But neither works. There's a way to do this?
Edit: What I'm trying to do is to add a letter to the end of each word in a file. In order to do so I ask if the next char is a punctuation mark, but in this way the last word is left without an extra letter. I'm working just with char
, not string
.
istream::peek()
returns the constant EOF
(which is not guaranteed to be equal to -1) when it detects end-of-file or error. To check robustly for end-of-file, do this:
int c = file.peek();
if (c == EOF) {
if (file.eof())
// end of file
else
// error
} else {
// do something with 'c'
}
You should know that the underlying OS primitive, read(2)
, only signals EOF when you try to read past the end of the file. Therefore, file.eof()
will not be true when you have merely read up to the last character in the file. In other words, file.eof()
being false does not mean the next read operation will succeed.