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

时间:2012-10-20 23:39:12

标签: c++ buffer cin

所以我理解了一段代码:

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

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

以下是问题......

1)简单地在没有参数的情况下进行cin.ignore();会有什么不同?哪种情况更好用?

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

谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:1)

我可以回答你的第二个问题。 当您尝试输入两个不同的pragrah时,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之前遇到了文件结尾。 希望这可以帮到你。