1

所以我理解了一段代码:

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

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

以下是问题...

cin.ignore();1)不带参数的简单操作有什么不同?在什么情况下哪个更好用?

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

谢谢!

4

2 回答 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先在流上使用以获得完整的线条。这只能在流已用尽(文件结尾或字符串结尾)时失败。然后您可以通过专用的解析逻辑继续处理每一行,并且可以以最合适的方式处理错误。原始流上的错误标志过于粗糙,无法进行优雅的控制流设计。

于 2012-10-20T23:51:01.357 回答
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 之前遇到了文件结尾。希望这会有所帮助。

于 2013-03-16T06:39:10.990 回答