编辑:我的原始测试程序代码中有一个微妙的错误:
" 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 ++标准不支持文本文件中的相对定位。
但我在标准中找不到这样的信息。你能给我一个参考吗?
答案 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);