cin.clear()不会重置cin对象

时间:2011-09-14 08:17:11

标签: c++ inputstream invalid-characters

我有以下循环。它应该读取数字,直到EndOfFile或用户输入-999

int arr[100];

int index;

for (index = 0; index < 100; index++)
{
 cin >> arr[index];
 if (!cin)
 {
  cin.clear();
  index--;
  continue;
 }
 if (arr[index] == -999)
 {
     break;
 }
}

当用户输入无效内容时,例如某些char s,此循环将一直重复,不会clear错误状态或停止。

1 个答案:

答案 0 :(得分:9)

调用clear后,您还必须以某种方式从流中删除无效输入。这是一种方式:

 cin >> arr[index];
 if (!cin)
 {
  cin.clear();
  std::string ignoreLine; //read the invalid input into it
  std::getline(cin, ignoreLine); //read the line till next space
  index--;
  continue;
 }

这是因为当cin无法读取无效输入时,它仍保留在流中。必须通过某种方式将其删除。我只是阅读并忽略它。

您也可以将ignore用作:

cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(),' ');

这在我看来更好,只要输入 space 分开(如果你不想检查无效输入)。 online doc说:

  

<强> istream的::忽略

     

istream的&安培; ignore(streamsize n = 1,int delim = EOF);

     

提取并放弃字符

     

从输入序列中提取字符并将其丢弃。

     

提取n个字符后,提取结束   丢弃或找到字符分隔时,以先到者为准。   在后一种情况下,也会提取delim字符本身。