[英]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>>
將1
、 2
、 3
讀入緩沖區,然后遇到 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.