簡體   English   中英

當達到流的EOF時,seekg()不會設置eofbit。 是設計使然嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM