Итерация по каждой строке файла - PullRequest
1 голос
/ 04 октября 2019

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

Acetaldehyde    20.8
Acetone     50.5
Acetylene   -84
Ammonia     -35.5

Всего веществ примерно в 4 раза больше, чем это. Моя проблема с чтением каждой строки файла. То, что у меня есть, прочитает первую строку, а затем завершит мой цикл. Всякий раз, когда я пытаюсь использовать getline, я получаю только температуру, а не названия.

using namespace std;

int main()
{
   ifstream inData;
   inData.open("input.txt");

   string substanceName;
   int boilPoint, min, max;

   cout << "Common Chemicals and Substances: " << endl;
   cout << endl;
   cout << left << setw(20) << "Substance" << right << " " << "Boiling Point" << endl;
   cout << setw(35) << setfill('-') << " " << endl;
   cout << setw(35) << setfill(' ') << " " << endl;

   inData >> substanceName >> boilPoint;
   while (inData)
   {
      cout << left << setw(20) << substanceName
           << right << " " << boilPoint << endl;
      inData >> substanceName >> boilPoint;
   }
   inData.close();
   return 0;
}

Вывод выглядит корректно, но в нем отсутствуют все остальные вещества в файле


Substance            Boiling Point
---------------------------------- 

Acetaldehyde         20

Моя главная цель здесь состоит в том, чтобы перебирать каждую строку, не вдаваясь в более сложный код. Я думаю, что что-то не так с моей петлей, но я не могу выяснить, что. Или я должен использовать getline, но я не понимаю, как его использовать, а также учитывать как строковые, так и переменные int, поступающие из файла.

1 Ответ

2 голосов
/ 04 октября 2019

Вы пытаетесь прочитать точку кипения как целое число, но в файле это с плавающей точкой. Таким образом, он перестает читать первую точку кипения в . (вот почему температура кипения уксусного альдегида отображается как 20 вместо 20,8, который содержится в файле). Это приводит к потере синхронизации, поэтому он пытается прочитать .8 как второе имя (что успешно, хотя это не то, что вам нужно), но затем пытается прочитать следующее имя (Acetone) как int,который, очевидно, дает сбой, оставляя поток в состоянии сбоя и прерывая цикл.

Измените boilPoint с int на double, и все должно работать лучше.

...