Под windows10 и VS2017:
Я пытался прочитать двойное число 1.1
с клавиатуры с помощью istream и поместить его в переменную типа int, скажем temp
. По причине temp
равно 1
, но istream, похоже, застрял в каком-то состоянии ошибки. В ожидании istream должен остановиться и дождаться ввода с клавиатуры, но он продолжает повторное чтение из буфера и на этот раз происходит ошибка.
Я проверил rdstate()
, и он был равен 2
после 2-го раунда чтения из буфера. Я знаю, что это было ненормально, но почему?
Для репликации, запустите код, введите 1.1
в консоли и нажмите Enter, появится ошибка.
На самом деле, я использовал int32, чтобы попытаться сохранить double по некоторым причинам. Предполагается, что программа будет печатать правильный ввод с клавиатуры. Здесь действительный относится к тому, что ввод не должен превышать диапазон int32 или быть двойным / читаемым символом. В противном случае программа должна напечатать Invalid input
на экране.
#include <iostream>
std::istream& f(std::istream &in) {
int temp = 0;
while(true) {
while (in >> temp) {
if (temp == -1) {
break;
}
std::cout << temp << std::endl;
}
if (in.eof()|| temp == -1) break;
if (!in) {
std::cout << "Invalid input" << std::endl;
in.clear();
in.ignore(10000,32);
}
}
in.seekg(0, std::ios::beg);
return in;
}
int main(){
std::cout << "Please input some integers and end with ^Z or -1" << std::endl;
f(std::cin);
return 0;
}