簡體   English   中英

為什么輸入EOF時會設置failbit?

[英]Why is failbit set when I enter EOF?

我目前正在學習while (cin >> num)如何工作,我發現有兩個步驟。 First one is the operator>> function return a istream object with error state, and the second is bool converter that convert istream object into bool depend on its state.

但我發現在布爾轉換 function 中令人困惑的是,只有在設置了失敗位或壞位時它才會返回 0。 並且操作員>> function 如果讀取 EOF 將設置 eofbit。

布爾轉換 function: https://www.cplusplus.com/reference/ios/ios/operator_bool/

運營商>> function: https://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

在這種情況下,在我輸入 EOF 后,布爾轉換器應該返回 1,因為未設置故障位和壞位。

因此,我使用下面的程序來檢查輸入 EOF 后錯誤位實際發生了什么。 而且我發現進入EOF后會設置failbit!

所以我想知道是否有人可以幫助我理解為什么設置失敗位?

#include <iostream>

using namespace std;

int main()
{
    int num;
    cin >> num;
    cout << cin.eof() << " " << cin.fail() << " " << cin.bad() << endl;
    return 0;
}

Input: ^Z(on windows using qt creator, non qt c++ project) Output: 1 1 0 Input: ^D(on windows using qt creator, non qt c++ project) Output: 0 1 0

當讀取操作在將數據讀取到流的緩沖區時遇到 EOF 時設置eofbit 數據尚未處理。

當請求的數據無法從緩沖區中提取時設置失敗位,例如使用operator>>讀取failbit時。 在等待數字到達時,可能會發生 EOF。 eofbit不足以輸入錯誤 state,因為緩沖區中可能有可用數據。

因此,例如,假設使用了一個while (cin >> num)循環並且用戶輸入123<Ctrl-Z>

  • 在第一次迭代中, operator>>123讀入緩沖區,然后遇到 Ctrl-Z,因此它設置eofbit並停止讀取。 然后將123從緩沖區中提取到num中,然后操作員退出。 此時,stream 尚未出現錯誤 state。 當通過while評估流的bool轉換時,它返回 true,允許輸入while主體以便它可以處理num

  • 在下一次迭代中, operator>>看到eofbit已設置,從而阻止進一步閱讀。 緩沖區中沒有任何東西可以提取到num中,因此操作員設置了failbit並退出。 stream 現在出現錯誤 state。 當通過while評估流的bool轉換時,它返回 false,從而中斷while循環。

如果 EOF 是第一個輸入,則operator>>無法讀取 integer,因此 stream 輸入了fail() state。

如果您在 Ctrl-Z 之前至少鍵入一位數字,則會讀取該數字並且輸入成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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