【问题标题】:Iterating through each line of a file遍历文件的每一行
【发布时间】:2020-02-02 08:07:09
【问题描述】:

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

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】:

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

    boilPointint 更改为 double,事情应该会更好。

    【讨论】:

    • 是的,这正是我的问题。我知道这很简单,我只需要另一双眼睛。感谢您的评论和解释得这么好。
    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多