我正在尝试制作一个跟踪平均温度和降雨量的程序。我有一个文本文件,每行有四个整数(每行代表一天),我想一次读取一行并每天处理每个变量。

问题是我似乎无法将文件值读入变量。当我将变量打印到屏幕上时,它只会打印垃圾。 PS。在下面的代码中,我尝试仅处理文件的第一行。如何从每一行中一次阅读?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
    {
    string fileName = "metrolog.dta";
    string buffer;
    int numOfDays = 0,
        dayNumber,
        maxTemp,
        minTemp,
        rainfall,
        tempDiff,
        tempDiffMax,
        totalMaxTemp,
        totalMinTemp,
        totalRainfall;

ifstream infile(fileName);

    while(getline(infile, buffer))
        if(!buffer.empty())
            ++numOfDays;

    cout << "Number of entries: " << numOfDays << endl;

    infile >> dayNumber >> minTemp >> maxTemp >> rainfall;
    cout << dayNumber << " " << minTemp << " " << maxTemp << " " << rainfall << endl;


    return 0;
    }


该文件如下所示:

 1      9      12       23
 2      8       9       20
 3      7      13       18
 4      8      10       15
 5      7      13       10
 6      6       9        8
 7      5       8       12
 8      4      10        6
 9      3       9       12
10      4       7        6

最佳答案

问题是

while(getline(infile, buffer))
        if(!buffer.empty())
            ++numOfDays;


读取直到文件末尾。然后在您的下一个阅读中

infile >> dayNumber >> minTemp >> maxTemp >> rainfall;


由于已设置eof标志,因此没有任何反应

cout << dayNumber << " " << minTemp << " " << maxTemp << " " << rainfall << endl;


打印出变量中的所有垃圾,因为您没有将它们初始化为任何特定的变量。您需要将流指针重设回文件的开头。你可以这样做

infile.clear(); // clear error flags
infile.seekg(0, std::ios::beg); // set stream back to the beginning


另一种方法是读取文件并同时计算行数。你可以这样做

while (infile >> dayNumber >> minTemp >> maxTemp >> rainfall)
{
    ++numOfDays;
    cout << dayNumber << " " << minTemp << " " << maxTemp << " " << rainfall << endl;
}


但这仅在您可以打印出列表后的条目数时才有效。

07-24 09:44
查看更多