seekg()在达到流的EOF时不设置eofbit。它是按设计的吗?

时间:2016-02-25 13:11:22

标签: c++ c++11 stream

编辑:我的原始测试程序代码中有一个微妙的错误: " char=" << aStream.peek()行(也可能是" input pos=" << aStream.tellg())修改了流状态标志,因此没有报告真实状态。所以这些调用必须从代码中完全删除,否则我们无法看到seekg()对状态标志的真正影响。 但结果仍然相同:eofbit未设置。

原帖:

我尝试通过调用

一步推进输入指针来检测std::istream的EOF
seekg( 1, std::ios_base::cur )

但是当seekg()设置流的failbit时,eofbit会将1个位置移到EOF之外。 永远不会设置#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和seekg编译。您可以在此处运行此代码:http://coliru.stacked-crooked.com/a/69f4d70e93359423

此外,_PlayerManager = GameObject.Find("Player").GetComponent<GameManager>;https://msdn.microsoft.com/en-us/library/y2d6fx99(v=vs.120).aspx)上的MS文档表示C ++标准不支持文本文件中的相对定位。

但我在标准中找不到这样的信息。你能给我一个参考吗?

1 个答案:

答案 0 :(得分:2)

只要您对标准没问题就说这是我们从[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而且还会设置{{1因为我们在文件的末尾,提取失败

failbit

输出:

input.seekg(0, std::ios::end);
info (input);
char ch;
input >> ch;
info (input);

Live Example