Как обнаружить ошибку при вводе из istream_iterator<int>

248
23 ноября 2017, 04:00

Хочу заполнить вектор со стандартного потока ввода cin с использованием std::istream_iterator. Есть такой код:

#include<iostream>
#include<iterator>
#include<vector>
int main()
{
  std::istream_iterator< int > in(std::cin);
  std::istream_iterator< int > end;
  typedef std::vector< int > int_vector;
  int_vector data;
  std::back_insert_iterator< int_vector > target(data);
  while (in != end)
  {
    *target = *in;
    ++in;
    ++target;
  }
  std::ostream_iterator<int> out(std::cout, ", ");
  std::copy(data.begin(), data.end(), out);
  return 0;
}

Отсюда два вопроса:

  1. Как корректно завершить ввод?
  2. Как решить проблему с неверным вводом (введут не int, а double например)?
Answer 1

in == end в конце ввода (EOF) или если любая ошибка ввода произошла. Поэтому если цикл у вас преждевременно завершится, то это значит что произошла ошибка. Её можно обнаружить, проверив достиг ли ввод конца: cin.eof():

#include <iostream>
#include <iterator>
#include <vector>
int main() {
  std::istream_iterator<int> numbers { std::cin  }, eof;
  // populate vector
  std::vector<int> v;
  std::copy(numbers, eof, std::back_inserter(v));
  // print vector
  std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n"));
  return !std::cin.eof(); // success on eof
}

Пример.

Что равнозначно:

#include <iostream>
#include <iterator>
#include <vector>
int main() {
  // populate vector
  std::vector<int> v;
  for (int n; std::cin >> n; )
    v.push_back(n);
  // print vector
  for (int n : v)
    std::cout << n << '\n';
  return !std::cin.eof(); // success on eof
}

Пример.

READ ALSO
Inline функции в C и С++

Inline функции в C и С++

В чем разница inline функций в C и C++? Желательно со ссылкой на стандарт

346
Изменение размера map

Изменение размера map

Мяч находится на игровом поле m на n в ячейке (i, j), его можно передвигать Найдите количество возможных путей вывода мяча за пределы игрового...

263
Скриншот рабочего стола Windows при отсутствии залогиненного пользователя (С++)

Скриншот рабочего стола Windows при отсутствии залогиненного пользователя (С++)

На удалённом сервере запущена программа, деятельность которой хочется мониторить через централизованную систему наблюденияВместе с ней...

256
C++ Poco Отправка post запроса

C++ Poco Отправка post запроса

Пытаюсь отправить запрос post но не получается, Get приходит а post нет

396