Как принять следующий ввод в C

#c #iostream

#c #iostream

Вопрос:

Я должен принять переменное количество двойных значений, а затем символ, чтобы завершить ввод двойных значений (считываемых в список InData). После этого я должен ввести 2 целых числа в i и m.

Проблема в том, что cin переполнен.

я должен принять следующий ввод в программу

 0.594
0.928
0.515
0.055
0.507
0.351
0.262
0.797
0.788
0.442
0.097
0.798
0.227
0.127
0.474
0.825
0.007
0.182
0.929
0.852
e
2 5
 

Для этого мой код выглядит так:

 #include <iostream>
#include <list>
#include <cstdio>
using namespace std;

int main (void)
{    list <double> inData;
     double temp;
     int i, m, M, N;
     char a;
     while (cin >> temp)
     {    inData.push_back(temp);
     }
     N = inData.size();
     //fflush(cin);
     //cin >> a;
     cin.ignore(1);
     cin >> i >> m;
     cout << (int )a << " " << N << " " << i <<  " ABC " << m << endl;
     return 0;
}
 

Что в этом плохого .. пожалуйста, посмотрите, почему он не принимает значения i и m. i и m дают значения мусора в строке cout…

Вывод будет

 -65 20 233304 ABC 213344
 

где 1-е, 3-е и 5-е значения являются мусором.

Ответ №1:

Попробуйте это:

 cin.clear();
cin >> a;
 

Комментарии:

1. @Saurajeet — Пожалуйста, проголосуйте за все ответы, которые вы сочли полезными (щелкните изображение со стрелкой вверх) и примите ответ, который вы сочли наиболее полезным (щелкните изображение с галочкой).

Ответ №2:

Когда cin >> temp , наконец, произойдет сбой (из-за обнаружения маркера «e»), failbit будет установлен on cin , что предотвращает чтение дополнительных данных из потока до тех пор, пока он не будет clear отредактирован.

 while (cin >> temp) { inData.push_back(temp); }
N = inData.size();
cin.clear(); // <---
cin >> a >> i >> m; // no need to 'ignore' or flush anything
 

Ответ №3:

Я думаю, что вы хотите:

      do{
        cin >> temp;     
        if (cin.good())
            inData.push_back(temp);
     } while (cin.good());
     cin.clear();
 

вместо цикла while.

a Переменная больше не считывается из cin , поэтому, скорее всего, будет мусором.

Комментарии:

1. может быть упрощен до просто while (cin >> temp) inData.push_back(temp); cin.clear();

2. Ах! Теперь я вижу. Я не знал о operator void* in istream и продолжал задаваться вопросом, почему это вообще работает.

Ответ №4:

Когда дело доходит до строки

     N = inData.size(); 
 

cin находится в недопустимом состоянии.Любые операции с cin завершатся неудачей. вы должны сбросить его значения и использовать его.