遍历文件的每一行

问题描述 投票:0回答:1

我正在构建一个程序,该程序读取文件作为输入,将文件输出到控制台,并对某些输入执行一些计算。输入文件是物质及其沸点的列表,如下所示:

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变量。

c++ loops file-io formatting getline
1个回答
1
投票

您正尝试将沸点读取为整数,但在文件中为浮点。因此,它将停止读取.处的第一个沸点(这就是为什么乙醛的沸点显示为20而不是文件包含的20.8的原因)。这样会使事情变得不同步,因此它尝试将.8读取为第二个名称(即使不是您想要的名称,它也会成功),但随后尝试将下一个名称(丙酮)读取为int,这显然失败了,使流处于失败状态,并中断了循环。

boilPointint更改为double,并且应该可以更好地工作。

© www.soinside.com 2019 - 2024. All rights reserved.