0

我被要求编写一个程序来打开一个 txt.doc 并找到:列表中的数字数量、总和和平均值。随着我编译代码,我的阀门等于零。我无法找出我哪里出错了。

#include <cstdlib>
#include <cmath>
#include <iomanip>
#include <fstream>

using namespace std;

 int main()
 {
     ifstream inputFile;
     string filename;
     int valve;
     int aNumber = 0;
     int numbers = 0;
     double sum = 0.0;
     double average = 0.0;

     // get file from user
     cout << "enter the filename\n";
     cin >> filename;
     cout << "_________________________________________\n";
     // open file
     inputFile.open(filename.c_str());

     // if loop(if the file successfully opened, process it.)

     if (inputFile)
     {
         while (inputFile >> valve)
         {
             cout << valve << endl;
         }
     }
     else
     {
         //display an error message
         cout << "Error opening the file\n";
     }

     cout << "\n";

     while (inputFile >> aNumber)
     {
         numbers++;
         sum += aNumber;
     }

     if (numbers > 0)
         average = sum / numbers;
     else
         average = 0.0;

     cout << "Number of numbers: " << numbers << "\n";
     cout << "Sum is: " << sum << "\n";
     cout << "Average is: " << average;


     inputFile.close();
     return 0;
 }

我不知道为什么我的“数字”“总和”“平均”= 零。

4

1 回答 1

1

您的代码的问题是您尝试多次读取同一个文件而没有结束它:一旦流转换为false它,它将保持此状态,直到流状态被清除并忽略任何实际文件操作。此外,即使您clear()是文件的状态,它也会在尝试读取数据时立即返回失败状态,因为下一个值格式错误或到达流的末尾。不过,您可以 clear()将状态seekg()放在文件的开头(尽管我推荐这种方法):

while (inputFile >> value) {
    ...
}
inputFile.clear(); // clear any state flags
inputFile.seekg(0, std::ios_base::beg);

读取文件通常相当昂贵,更不用说“文件”的某些源不能多次读取(例如,命名管道看起来像一个文件,但只能读取一次)。成本来自于访问物理媒体的需要,以及如果访问速度很快,则来自程序内部的转换。因此,您最好只读取一次文件并在同一遍中进行所有相关计算。如果认为组合这些操作不合理,您可能希望将内容加载到容器中,然后对容器进行操作:

std::vector<double> values{ std::istream_iterator<double>(inputFile),
                            std::istream_iterator<double>() };
// now use values

如果您认为文件很大:在这种情况下,您实际上不想多次读取文件,也不想将其存储在容器中,即,您将一次性处理文件. 对于手头的任务,这样做是相当微不足道的,当然也很可行。

于 2013-11-03T19:39:11.003 回答