[英]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.