Использование cin >> для обработки ошибок - PullRequest
1 голос
/ 20 июня 2011

Я сталкивался с этим в своих чтениях ...

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.Что именно делает клир, если он не очищает клин?Спасибо.

Ответы [ 4 ]

3 голосов
/ 20 июня 2011

.clear() очищает флаги ошибок в cin. Они устанавливаются, если вход не может быть преобразован, например. Пока установлен любой флаг ошибки, извлечение ввода из cin произойдет с молчанием.

1 голос
/ 20 июня 2011

то, что делает cin.clear () - очищает флаги ошибок потока cin. Когда это происходит, операции потока cin могут продолжаться. Следующая строка извлекает символ из потока и возвращает его. Чтобы понять, что делает цикл, рассмотрим следующий случай:

Предположим, что массив имеет тип int, и вы вводите: abc и затем нажимаете ввод. cin указывает, что строковый ввод не может войти в массив int. и поэтому он возвращает false и устанавливает флаг ошибки. Когда вы выполняете cin.clear (), он сбрасывает флаги ошибки, чтобы можно было продолжить дальнейшие операции (cin.get () может работать). Теперь cin.get () извлекает поток. поскольку он не равен '\ n', цикл продолжается (второй цикл) до тех пор, пока он не извлечет '\ n' =>, что означает, что введенный вами неверный i / p полностью смыт, и вы можете начать заново

1 голос
/ 20 июня 2011

Функция 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 открывается для операций ввода, нона нем выполняется только операция вывода, поэтому бит бит установлен.Затем в примере вызывается clear, чтобы удалить флаг и разрешить дальнейшие операции, такие как getline, успешно выполняться над myfile.

Ссылка: ios :: clear

0 голосов
/ 20 июня 2011
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: ";
}

Информация в комментариях.

...