Ctrl-D
使標準輸入報告EOF但保持打開文件。您可以EOF後重用std::cin
,如下面的簡單程序演示:
#include <iostream>
#include <string>
int main()
{
for (;;)
{
for (std::string s; std::cin >> s;)
{
std::cout << "Got token: " << s << "\n";
}
std::cin.clear();
std::cout << "Received EOF\n";
}
}
現在,解析整數的時候,有一個解析錯誤的可能性。在這種情況下,流不是EOF,而是處於「失敗」狀態。您還需要清除該錯誤,但還需要丟棄不可解析的值。爲此你需要ignore
:
#include <iostream>
#include <limits>
int main()
{
for (;;)
{
for (int n; std::cin >> n;)
{
std::cout << "Got integer: " << n << "\n";
}
if (std::cin.eof())
{
std::cout << "Received EOF\n";
std::cin.clear();
}
else
{
std::cout << "Parsing failure\n";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
}
您在使用ignore
錯誤是雙重的:你只能忽略一個字符,即使輸入可以想見,由一個以上的無法解析的性格,而你忽略高達EOF,而不是直到下一個換行符:這是因爲ignore()
具有默認參數,並且ignore()
與ignore(1, EOF)
相同。
[連續cin的問題]的可能重複(http://stackoverflow.com/questions/5146344/problem-with-consecutive-cins) – jsantander
什麼是'.ignore()'? –
不用理睬,它是相同的輸出... –