1

我在阅读中遇到了这个...

while(!(std::cin >> array[i])) 
{
std::cin.clear(); 
while(std::cin.get()!= '\n') 
continue; 
std::cout << "enter a new input: ";
}

而且,我真的不明白错误处理是如何工作的。std::cin.clear()被使用,但代码继续从下一行的 cin 对象中获取字符,然后使用 continue 语句。如果不清除 cin,clear 到底做了什么?谢谢你。

4

4 回答 4

3

.clear()清除中的错误标志cin。例如,如果输入无法转换,它们就会被设置。当设置了任何错误标志时,从中提取输入cin将静默失败。

于 2011-06-20T07:40:09.727 回答
1

clear函数为错误控制状态设置一个新值。

考虑以下示例:

// clearing errors
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  char buffer [80];
  fstream myfile;

  myfile.open ("test.txt",fstream::in);

  myfile << "test";
  if (myfile.fail())
  {
    cout << "Error writing to test.txt\n";
    myfile.clear();
  }

  myfile.getline (buffer,80);
  cout << buffer << " successfully read from file.\n";

  return 0;
}

在上面的示例中,myfile 是为输入操作打开的,但只对其执行了输出操作,因此设置了 failbit。然后该示例调用 clear 以删除标志并允许在 myfile 上成功执行 getline 等进一步操作。

参考:ios::clear

于 2011-06-20T07:44:52.870 回答
1

cin.clear() 所做的是清除 cin 流的错误标志。当它这样做时,cin 流操作可以继续。下一行从流中提取一个字符并返回它。要了解循环确实考虑以下情况:

假设数组是 int 类型,您输入:abc,然后按 Enter。cin 标识字符串输入不能进入 int 数组。因此它返回 false 并设置错误标志。当您执行 cin.clear() 时,它会重置错误标志,以便进一步的操作可以继续(cin.get() 可以工作)。现在 cin.get() 从溪流。因为它不等于 '\n' 循环继续(第二个循环),直到它提取 '\n' => 这意味着你刚刚输入的错误 i/p 都被冲走了你可以重新开始

于 2011-06-20T08:03:37.803 回答
0
while(!(std::cin >> array[i])) 
{
std::cin.clear();             //clears any error flags on cin so get() works
while(std::cin.get()!= '\n')  //in case white space is in the stream
{                             //loop until the end of line character
   continue;              
}
std::cout << "enter a new input: ";
}

评论中的信息。

于 2011-06-20T07:51:34.320 回答