The following code works with gcc 4.4.
But gcc 4.7 will give assertion failure.
#include <assert.h>
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
string input("abcdefg");
stringstream iss(input);
ostringstream oss;
oss << iss.rdbuf();
assert (!iss.eof());
(void) iss.peek();
assert (iss.eof());
// the following assertion will fail with gcc 4.7
assert( streamoff(iss.tellg()) ==
streamoff(input.length()) );
return 0;
}
In gcc 4.7, if the istream has reached EOF, tellg() will return -1. no pubseekoff() nor seekoff() will be called In gcc 4.4 it is not a problem.
Which is the supposed to be behavior, gcc 4.4 or gcc 4.7? Why?
According to C++11 section 27.7.2.3p40,
So gcc 4.7 has the correct behavior for the current version of C++ (assuming that
peek()
at end of stream causesfailbit
to be set, and it does during sentry construction, sinceskipws
is set by default).Looking at the wording of C++03, it is the same. 27.6.1.3p37. So the behavior you describe in gcc 4.4 is a bug.
To be precise,
eofbit
won't causetellg()
to return-1
. But the fact that you read past EOF sets thefailbit
, andtellg()
will return-1
ifbadbit
orfailbit
are set.The solution is to clear the status flags before calling
tellg()
: