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

问题描述 投票:1回答:2

所以我知道一段代码:

cin.ignore(80, '\n');

将清除最多80个字符的缓冲区,直到它遇到返回键(Enter键)并停止...对吧?

这里是问题...

1]简单执行无参数的cin.ignore();有什么不同?在哪种情况下使用哪种更好?

2)cin.clear();说它清除错误标志...这是什么意思?什么是错误标志,为什么要清除它们?

谢谢!

c++ buffer cin
2个回答
4
投票

在流对象上执行某些操作失败时,将在流对象上设置错误标志。一旦流出现错误,在重置错误状态之前,无法对它进行进一步的操作。

这是一个简单的示例:

std::istringstream iss("ABC123");

int n;
iss >> n;

assert(!iss);

现在流错误。但是,其中仍然有数据,可能值得重新设置并重试:

iss.clear();  // note: this must come first!

std::string token;
iss >> token;

assert(iss);

[而不是其他提取,也可以在iss.ignore()之后调用clear(),以防万一您知道必须忽略的内容才能重试。

通常,这种反复试验不是很好的方法,我发现。我总是会先在流上使用getline以获取完整的行。仅当流耗尽(文件末尾或字符串末尾)时,此操作才能失败。 然后您可以通过专用的解析逻辑继续处理每一行,并且可以以最适当的方式处理错误。原始流上的错误标志过于粗糙,无法进行优雅的控制流设计。


1
投票

我可以回答你的第二个问题。尝试输入两个不同的段落时,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之前曾遇到过文件结尾。希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.