2011-03-30 43 views

回答

1

幾乎根據定義,您不能確保從命令 行的讀取不會失敗。要做到這一點,你必須控制在鍵盤上鍵入的內容(或者在文件中,或者輸入從 重定向到的內容) 。您必須爲輸入中的錯誤做好準備。如果 您需要一個int,並且用戶輸入「abc」,則需要輸入 失敗,以便您可以檢測到錯誤並進行恢復。

在輸入流中,一旦檢測到錯誤,你必須重新 它(std::cin.clear()),然後重新同步以某種方式:在「ABC」是 仍然在流,並會在你未來的事情閱讀---取決於 應用程序,istream::ignore可以使用,但一個頻繁的成語 處理控制檯輸入是逐行閱讀,然後解析行 使用std :: istringstream,boost :: regex或任何其他 工具,你碰巧得心應手。如果這行只包含一個int,那麼這是一個多餘的行爲:std::cin.ignore(INT_MAX, '\n') 應該很好地做到這一點,但對於包含多個字段的行,按行方式行 可能更可取;它還具有 自動區分由於文件結束自語法錯誤 而失敗的優點。 (getlinestd::cin的失敗是文件結尾; 在讀取istringstream時失敗通常是語法錯誤。)

2

流的失敗位將被設置,並且進一步的操作將不執行任何操作,直到該位被清除。你可以閱讀更多關於流位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 
} 

有可能是收集輸入的更穩健的方式,但是你想要什麼取決於你的情況。

相關問題