C ++ fstream не читает следующую строку из файла - PullRequest
0 голосов
/ 28 апреля 2020

Я застрял в чтении текста и целого числа из файла, используя ifstream с c ++.

Моя цель - прочитать имя и фамилию, набрав 10 баллов. Он работает, но если отсутствует какой-либо тест, программа не будет читать следующую строку.

ifstream inputStream;
inputStream.open("input2.dat");
if (inputStream.fail() )
{
    cout << "Error opening the file.\n";
    exit(1);
}
ofstream fout;
fout.open("output.dat");
string firstname, lastname;
int quizScore = 0;
double sum = 0;
while (inputStream >> firstname >> lastname) 
{
    sum = 0;
    fout << firstname << ' ' << lastname;
    for (int i = 0; i < 10; i++)
    {
        inputStream >> quizScore;
        sum += quizScore;
        fout << " " << quizScore;
    }
    cout << firstname << "\t" << sum / 10 << "\n";
    fout << " " << sum / 10 << "\n";
}
inputStream.close();
fout.close();

input2.dat

Tony Dinozzo 50 45 40 35 30 15 10 5
Ziva David 50 45 50 45 38 
Timothy Mcgee 15 45 25 45 28 50 35 

1 Ответ

3 голосов
/ 28 апреля 2020

Проблема в том, что если нет 10 чисел, поток переходит в состояние ошибки и больше ничего не читает после этого. Вам придется очистить состояние ошибки потока, прежде чем он сможет прочитать что-либо еще.

while (inputStream >> firstname >> lastname) 
{
    sum = 0;
    fout << firstname << ' ' << lastname;
    for (int i = 0; i < 10; i++)
    {
       // Deal with missing numbers.
       if ( !(inputStream >> quizScore) )
       {
          break;
       }

        sum += quizScore;
        fout << " " << quizScore;
    }

    cout << firstname << "\t" << sum / 10 << "\n";
    fout << " " << sum / 10 << "\n";

    // Clear the error state before reading contents of next line
    inputStream.clear();
}

Для задач программирования, таких как та, с которой вы имеете дело, лучше всего:

  1. Читать содержимое файла построчно.
  2. Обрабатывать каждую строку отдельно.
std::string line;
while ( getline(inputStream, line) )
{
   std::istringstream str(line);
   str >> firstname >> lastname; 

   sum = 0;
   fout << firstname << ' ' << lastname;
   for (int i = 0; i < 10; i++)
   {
      // Deal with missing numbers.
      if ( !(str >> quizScore) )
      {
         break;
      }

      sum += quizScore;
      fout << " " << quizScore;
   }

   cout << firstname << "\t" << sum / 10 << "\n";
   fout << " " << sum / 10 << "\n";
}
...