[英]cin.ignore() and cin.clear() in C++
所以我明白了一段代碼:
cin.ignore(80, '\n');
將清除最多 80 個字符的緩沖區,直到它點擊返回(回車鍵)並停止......對嗎?
以下是問題...
1) 簡單地執行cin.ignore();
什么不同cin.ignore();
沒有參數? 在什么情況下使用哪個更好?
2) cin.clear();
說它清除錯誤標志......這是什么意思? 什么是錯誤標志,為什么要清除它們?
謝謝!
每當對流對象的某些操作失敗時,就會在流對象上設置錯誤標志。 一旦流出錯,在您重置錯誤狀態之前,無法對其進行進一步的操作。
這是一個簡單的例子:
std::istringstream iss("ABC123");
int n;
iss >> n;
assert(!iss);
現在流出錯了。 但是,其中仍然有數據,可能值得重置並重試:
iss.clear(); // note: this must come first!
std::string token;
iss >> token;
assert(iss);
除了再次提取之外,您還可以在clear()
iss.ignore()
之后調用iss.ignore()
,以防您知道在再次嘗試之前必須忽略的內容。
我發現,這種反復試驗通常不是一個很好的方法。 我總是首先在流上使用getline
來獲取完整的行。 這只會在流耗盡(文件結尾或字符串結尾)時失敗。 然后您可以通過專用的解析邏輯繼續處理每一行,並且可以以最合適的方式處理錯誤。 原始流上的錯誤標志太粗糙,無法進行優雅的控制流設計。
我可以回答你的第二個問題。 cin.clear() 函數在您嘗試輸入兩個不同的段落時很有用。 例如 :
std::vector<std::string> veca,vecb;
std::string x;
while(getline(std::cin,x))
veca.push_back(x);
cin.clear();
while(getline(std::cin,x))
vecb.push_back(x);
如果您沒有使用 cin.clear() 函數,則vecb
將一無所獲,因為 cin 之前遇到了文件結尾。 希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.