Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ seekg从当前位置归零重置eof标志_C++_Istream - Fatal编程技术网

C++ seekg从当前位置归零重置eof标志

C++ seekg从当前位置归零重置eof标志,c++,istream,C++,Istream,根据GCC 4.6.2istream.tcc: basic_istream<_CharT, _Traits>:: seekg(off_type __off, ios_base::seekdir __dir) { // _GLIBCXX_RESOLVE_LIB_DEFECTS // DR60. Do not change _M_gcount. // Clear eofbit per N3168. this->clear(this->rdstate() &a

根据GCC 4.6.2
istream.tcc

basic_istream<_CharT, _Traits>::
seekg(off_type __off, ios_base::seekdir __dir)
{
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // DR60.  Do not change _M_gcount.
  // Clear eofbit per N3168.
  this->clear(this->rdstate() & ~ios_base::eofbit);
basic\u istream::
seekg(关闭类型关闭,ios基本::seekdir目录)
{
//_GLIBCXX_解决_LIB_缺陷
//DR60.请勿更改计量。
//根据N3168清除eofbit。
this->clear(this->rdstate()&~ios_base::eofbit);
我意外地点击了这个按钮——并且无法理解为什么我在(!eof)循环时会得到一个无限的
。基本上,当seekg被零长度调用时——你仍然会得到eof重置。即使是零长度
std::ios\u base\uuu::cur
搜索,也有理由重置eof位吗?这在VC10/11中不会发生


什么是N3168?

问题是您滥用了
eof()
:此标志的唯一用途是确定您上次读取失败是否是因为您到达了文件的末尾(好吧,为了公平起见,它甚至没有这样做:即使设置了
eof()
,这可能不是真正的原因,尽管它可能是)。要确定流状态,请使用到
bool
的转换:

while (in) ...
请注意,您仍然需要在读取后检查读取是否成功


是一篇由标准化委员会讨论的论文。我不知道它讨论了什么特定的主题,除了它是针对国家身体缺陷报告的。我认为,N3168的动机是,通常情况下,如果设置了
eofbit
,那么所有进一步的操作都需要失败。这意味着如果您阅读了o在文件结束时,如果不先清除
eof
,您就无法返回到较早的点。纠正方法是,在尝试其他操作之前,要求seek函数重置
eofbit
。当然,如果输入失败,您仍然必须在查找之前清除,因此我认为这个问题相当罕见(输入文件末尾的整数,不带任何尾随空格,然后查找)但是从理论上讲,seekg与
ios_base::cur的偏移量为
0
时应该没有效果。或者,调用seekg后,它会一直运行,而不管
pos
值如何。查找当前位置的主要用途是将流更改为一种状态,在这种状态下,它可以用于读取或写入。此外,由于查找的目的是改变位置,因此假设流可能不在末尾似乎是合理的。我没有看过这篇文章,但我认为更改包括潜在的清除
failbit
:只要设置了任何位,大多数操作都将失败。