【问题标题】:Input from file producing garbage来自产生垃圾的文件的输入
【发布时间】:2015-12-28 18:35:22
【问题描述】:

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

问题是我似乎无法将文件值读入变量。当我将变量打印到屏幕上时,它只会打印垃圾。 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  

【问题讨论】:

  • 你从来没有读过里面的变量,
  • @Untitled123 她/他有。 infile &gt;&gt; dayNumber &gt;&gt; minTemp &gt;&gt; maxTemp &gt;&gt; rainfall;.
  • @cad 在读取整个文件并丢弃它之后不会。由于您粘贴的行将被执行,只有在整个文件已被读取之后。
  • @AlgirdasPreidžius 好的,但她/他会尝试。我读到 Untitled123 的评论为“这些变量未初始化,从未尝试过初始化。”
  • 老实说,我只是浏览了while循环的内容,发现缺少。

标签: c++ file input garbage


【解决方案1】:

问题是

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;
}

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

【讨论】:

  • 当然,正确的解决方案是计算第一次读取文件的天数,然后再输出。
猜你喜欢
  • 2012-11-27
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多