簡體   English   中英

C++ 中的 cin.ignore() 和 cin.clear()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM