所以我想知道如果我有下面的代碼Istream失敗。什麼是安全的方式來使用它!
int i;
cin>> i;
但我實際上已經進入而不是整數時會發生什麼。它失敗?有什麼方法可以確保從命令行讀取不會失敗?
所以我想知道如果我有下面的代碼Istream失敗。什麼是安全的方式來使用它!
int i;
cin>> i;
但我實際上已經進入而不是整數時會發生什麼。它失敗?有什麼方法可以確保從命令行讀取不會失敗?
幾乎根據定義,您不能確保從命令 行的讀取不會失敗。要做到這一點,你必須控制在鍵盤上鍵入的內容(或者在文件中,或者輸入從 重定向到的內容) 。您必須爲輸入中的錯誤做好準備。如果 您需要一個int,並且用戶輸入「abc」,則需要輸入 失敗,以便您可以檢測到錯誤並進行恢復。
在輸入流中,一旦檢測到錯誤,你必須重新 它(std::cin.clear()
),然後重新同步以某種方式:在「ABC」是 仍然在流,並會在你未來的事情閱讀---取決於 應用程序,istream::ignore
可以使用,但一個頻繁的成語 處理控制檯輸入是逐行閱讀,然後解析行 使用std :: istringstream,boost :: regex或任何其他 工具,你碰巧得心應手。如果這行只包含一個int,那麼這是一個多餘的行爲:std::cin.ignore(INT_MAX, '\n')
應該很好地做到這一點,但對於包含多個字段的行,按行方式行 可能更可取;它還具有 自動區分由於文件結束自語法錯誤 而失敗的優點。 (getline
對std::cin
的失敗是文件結尾; 在讀取istringstream時失敗通常是語法錯誤。)
流的失敗位將被設置,並且進一步的操作將不執行任何操作,直到該位被清除。你可以閱讀更多關於流位here。
如果你不希望它失敗,只需檢查一下:
int i;
std::cin >> i;
if (!std::cin)
{
// didn't read correctly, handle it
}
或者在一個下跌 - 滑移:
int i;
if (!(std::cin >> i))
{
// didn't read correctly, handle it
}
有可能是收集輸入的更穩健的方式,但是你想要什麼取決於你的情況。
而這被標記爲C因爲...? – GManNickG 2011-03-30 03:30:31