cin.ignore() and cin.clear() in C++

cin.ignore() and cin.clear() in C++

本文关键字:cin C++ in clear and ignore      更新时间:2023-10-16

,所以我知道一块代码:

cin.ignore(80, 'n');

将清除多达80个字符的缓冲区,直到它击中返回(输入键)并停止...对?

这是问题...

1)简单地使用没有参数的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(),以防您知道要再次尝试之前必须忽略什么。

通常,我发现这种反复试验不是一个很好的方法。我将始终先在流上使用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之前遇到了文件终止。希望这会有所帮助。