C++ 如何计算text.doc中数字的总和和平均值

C++ 如何计算text.doc中数字的总和和平均值,c++,C++,我被要求编写一个程序来打开一个txt.doc,并找到:列表中的数字数量、总和和平均值。用我编译的代码,我的值等于零。我找不出哪里出了错 #include <cstdlib> #include <cmath> #include <iomanip> #include <fstream> using namespace std; int main() { ifstream inputFile; string filename;

我被要求编写一个程序来打开一个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;
 }
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
ifstream输入文件;
字符串文件名;
int阀;
整数个数=0;
整数=0;
双和=0.0;
双平均=0.0;
//从用户获取文件
cout>文件名;
cout>阀门)
{

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

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

std::vector<double> values{ std::istream_iterator<double>(inputFile),
                            std::istream_iterator<double>() };
// now use values
std::vector values{std::istream_迭代器(inputFile),
std::istream_iterator()};
//现在使用值

如果您认为该文件很大:在这种情况下,您实际上不想多次读取该文件,也不想将其存储在容器中,也就是说,您只需一次处理该文件。因为手头的任务非常简单,而且肯定是非常可行的。

您已经使用第一次运行了
inputFile
到eof循环,第二个循环不会为您做任何事情。(假设文件只包含有效的
int
值;如果不包含,则
fail
位仍然设置在
inputFile
上,需要清除,并且在继续之前跳过错误的输入数据)。研究整数除法与浮点法。
std::vector<double> values{ std::istream_iterator<double>(inputFile),
                            std::istream_iterator<double>() };
// now use values