我被要求编写一个程序来打开一个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;
}
我不知道为什么我的“数字”“总和”“平均”=零。
答案 0 :(得分: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
如果您认为该文件很大:在这种情况下,您确实不想要多次读取该文件,也不想将其存储在容器中,即你只需要一次处理文件。因为手头的任务是相当微不足道的,当然也是可行的。