我目前正在學習如何while (cin >> num)作業,我發現有兩個步驟。第一個是 operator>> 函式回傳一個錯誤狀態的 istream 物件,第二個是 bool 轉換器,它根據狀態將 istream 物件轉換為 bool。
但是我發現在 bool convert 函式中,只有在設定了 failbit 或 badbit 時它才會回傳 0,這很令人困惑。如果 operator>> 函式讀取 EOF,它將設定 eofbit。
bool 轉換函式:https : //www.cplusplus.com/reference/ios/ios/operator_bool/
運算子>>函式:https : //www.cplusplus.com/reference/istream/istream/operator>>/
在這種情況下,在我輸入 EOF 后,bool 轉換器應回傳 1,因為未設定 failbit 和 badbit。
因此,我使用下面的程式來檢查進入 EOF 后錯誤位實際發生了什么。而且我發現進入EOF后會設定failbit!!
所以我想知道是否有人可以幫助我理解為什么設定了故障位?
#include <iostream>
using namespace std;
int main()
{
int num;
cin >> num;
cout << cin.eof() << " " << cin.fail() << " " << cin.bad() << endl;
return 0;
}
輸入:^Z(在 Windows 上使用 qt creator,非 qt c 專案)輸出:1 1 0
輸入:^D(在 Windows 上使用 qt creator,非 qt c 專案)輸出:0 1 0
uj5u.com熱心網友回復:
eofbit當讀取操作在將資料讀入流的緩沖區時遇到 EOF 時設定。資料尚未處理。
failbit當請求的資料無法從緩沖區中提取時設定,例如讀取帶有operator>>. 在等待數字到達時,可能會發生 EOF。eofbit僅僅進入錯誤狀態是不夠的,因為緩沖區中可能有可用的資料。
因此,例如,假設使用了一個while (cin >> num)回圈并且用戶輸入123<Ctrl-Z>。
在第一迭代中,
operator>>讀1,2,3到緩沖器,然后遇到按Ctrl-Z,所以它設定eofbit并停止讀數。123然后從緩沖區中提取出來num,操作員退出。此時,流尚未處于錯誤狀態。當流的bool轉換由 求值時while,它回傳 true,允許輸入while主體以便它可以處理num。在下一次迭代中,
operator>>seeseofbit被設定,阻止進一步閱讀。緩沖區中沒有任何東西可以提取到 中num,因此運算子設定failbit并退出。流現在處于錯誤狀態。當流的bool轉換由 求值時while,它回傳 false,從而中斷while回圈。
uj5u.com熱心網友回復:
如果 EOF 是第一個輸入,則operator>>無法讀取整數,因此流進入fail()狀態。
如果您在 Ctrl-Z 之前至少鍵入一個數字,則讀取該數字并且輸入成功。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/379136.html
上一篇:01 - Vue3 UI Framework - 開始
下一篇:應用程式關閉后如何執行代碼?
