【发布时间】:2016-06-08 06:51:17
【问题描述】:
编辑:我的原始测试程序代码中有一个细微的错误:
" char=" << aStream.peek() 行(可能还有" input pos=" << aStream.tellg())修改了流状态标志,因此没有报告真实状态。所以这些调用必须从代码中完全删除,否则我们无法看到seekg() 对状态标志的真正影响。
但是结果还是一样:eofbit 没有设置。
原帖:
我尝试通过调用将输入指针推进 1 步来检测 std::istream 的 EOF
seekg( 1, std::ios_base::cur )
但是,seekg() 在设置流的failbit 时,会在 EOF 之外移动 1 个位置。
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
(由 gcc 5.2 使用 -std=c++11 编译。您可以在此处运行此代码:http://coliru.stacked-crooked.com/a/69f4d70e93359423)
此外,seekg (https://msdn.microsoft.com/en-us/library/y2d6fx99(v=vs.120).aspx) 上的 MS 文档说 C++ 标准不支持文本文件中的相对定位。
但我在标准中找不到此类信息。可以给我参考一下吗?
【问题讨论】: