2013-05-29 59 views
0

如果ifstream :: getline調用沒有找到分隔符,我知道它設置了failbit,但它是否也清除了緩衝區,或者它是否保持緩衝區完好無損,並設置失敗位讓您知道?ifstream getline找不到delim

+0

它的葉子緩衝完好,containting'failbit'成立之前提取的。 – jrok

回答

0

似乎有是關於輸入流的不同狀態有些混亂(這是正確的,他們混淆):

C++標準,表124

  • badbit指示輸入或輸出序列中的完整性丟失(例如來自文件的不可恢復的讀取錯誤);
  • eofbit表示輸入操作到達輸入序列的末尾;
  • failbit表示輸入操作未能讀取預期字符,或輸出操作未能生成所需字符。

即,failbit被設定時basic_istream::getline(char_type* s, std::streamsize count, char_type delim)提取count-1字符而沒有找到定界符(-1用於對存儲在終止\0)。這並不表示該流是bad,但它表示getline未能找到分隔符。在C++標準的basic_istream::getline

描述: [istream.unformatted]/18

  • 效果:[...]構建崗哨對象[=準備輸入和錯誤檢查之後,提取字符並將它們存儲到數組的第一個元素由s指定的連續位置。 字符被提取並存儲,直到發生以下情況之一
    1. 檔案結尾發生在輸入序列(在這種情況下,函數調用setstate(eofbit));
    2. traits::eq(c, delim) [=發現分隔符]用於下一個可用輸入字符c(在這種情況下輸入字符被提取但未被存儲);
    3. n小於一個或n - 1字符被存儲(在這種情況下函數調用setstate(failbit))。 [...]
  • 這些條件按所示順序進行測試。
  • 如果函數提取沒有字符時,它調用setstate(failbit) [...]
  • 在任何情況下,如果是n大於零,其然後存儲一個空字符[...]到的下一個連續的位置陣列。

[重視和遺漏礦]

0

here

在內部,該函數訪問由第一 構建哨兵對象(設置爲true noskipws)的輸入序列。然後(如果 好),它會從其關聯的流緩衝區對象 中提取字符,就像調用其成員函數sbumpc或sgetc一樣,最後在返回之前銷燬該哨兵對象。

似乎緩衝區被填充直到出現問題。 (見DYP的評論)

+0

我試着得到關於這種行爲的更多信息,但從我的理解我會說它保持完好。 – Djon

+0

我不這麼認爲?哨兵的目的是檢查流是否良好; 'getline'提取**直到出現一些像文件結束的情況;請參閱[cppreference](http://en.cppreference.com/w/cpp/io/basic_istream/getline)或標準[istream.unformatted]/18,「提取字符並存儲,直到發生以下情況之一:」 – dyp

+0

哦,那麼,謝謝澄清。 – Djon