[英]seekg() does not set eofbit when reaching EOF of a stream. Is it by design?
编辑:我的原始测试程序代码中有一个微妙的错误: " char=" << aStream.peek()
行(也可能是" input pos=" << aStream.tellg()
)修改了流状态标志,因此未报告真实状态。 因此,必须从代码中完全删除这些调用,否则我们将看不到seekg()
对状态标志的实际影响。 但是结果仍然相同:未设置eofbit
。
原始帖子:
我尝试通过调用将输入指针前进1步来检测std::istream
的EOF
seekg( 1, std::ios_base::cur )
然而seekg()
移动超出EOF 1点的位置,当它设置failbit
流的。 永远不会设置eofbit
。 查看此测试程序的输出:
#include <iostream>
#include <sstream>
using namespace std;
void info( int aRelativePos, istream& aStream )
{
cout << "POS=" << aRelativePos <<
" input pos=" << aStream.tellg() <<
" char=" << aStream.peek() <<
"\tGood: " << aStream.good() <<
" Eof: " << aStream.eof() <<
" Bad: " << aStream.bad() <<
" Fail: " << aStream.fail() << "\n";
}
int main()
{
istringstream input ("12");
int i=0;
while ( input.good() )
{
info( i, input );
input.seekg( 1, std::ios_base::cur ); //advance 1 step forward
++i;
}
info ( i, input );
return 0;
}
输出:
POS=0 input pos=0 char=49 Good: 1 Eof: 0 Bad: 0 Fail: 0
POS=1 input pos=1 char=50 Good: 1 Eof: 0 Bad: 0 Fail: 0
POS=2 input pos=-1 char=-1 Good: 1 Eof: 0 Bad: 0 Fail: 0
POS=3 input pos=-1 char=-1 Good: 0 Eof: 0 Bad: 0 Fail: 1
(由带有-std=c++11
的gcc 5.2编译。您可以在此处运行以下代码: http : //coliru.stacked-crooked.com/a/69f4d70e93359423 )
此外,关于seekg
MS文档( https://msdn.microsoft.com/zh-cn/library/y2d6fx99(v=vs.120).aspx )指出,C ++标准不支持文本文件中的相对定位。
但是我在标准中找不到这样的信息。 你能给我参考吗?
只要您对标准表示满意,这就是我们从[istream.unformatted]获得的行为
basic_istream<charT,traits>& seekg(pos_type pos);
效果:表现为未格式化的输入函数(如27.7.2.3,第1段中所述),不同之处在于该函数首先清除
eofbit
,它不计算提取的字符数,并且不影响后续对的调用返回的值。gcount()
。 构造哨兵对象后,如果fail() != true
,则执行rdbuf()->pubseekpos(pos, ios_base::in)
。 如果发生故障,该函数将调用setstate(failbit)
(可能会引发ios_base::failure
)。
因此,按照标准,我们将始终清除eofbit
并且在发生故障时仅设置故障位。 尝试读取失败结束之后就是失败,所以这就是为什么要设置它。 仅到达文件末尾并不是失败,因为末尾是有效位置。
您可以在此示例中(从您的代码修改而来)看到,一旦我们到达文件末尾,我们仍然会很好,然后尝试从那里读取不仅会设置eofbit
,还会设置eofbit
failbit
就像我们在文件末尾一样。提取失败
input.seekg(0, std::ios::end);
info (input);
char ch;
input >> ch;
info (input);
输出:
Good: 1 Eof: 0 Bad: 0 Fail: 0
Good: 0 Eof: 1 Bad: 0 Fail: 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.