Мне было предложено написать программу, чтобы открыть txt.doc и найти: количество чисел в списке, сумму и avg. Скомпилировав код, мои клапаны равны нулю. Я не знаю, где я ошибся.
#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;
}
Я не знаю, почему мои "цифры" "sum" "average" = zero.
Проблема с вашим кодом заключается в том, что вы пытаетесь прочитать один и тот же файл несколько раз, не теряя его конца: как только поток преобразуется в 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
Если вы утверждаете, что файл большой: в этом случае вы действительно не хотите читать файл более одного раза и не хотите хранить его в контейнере, т.е. Обрабатывать файл за один проход, Поскольку задача, стоящая перед нами, делает ее довольно тривиальной и, безусловно, вполне осуществимой.
inputFile
для eof с первым циклом. Второй цикл ничего не сделает для вас. (предполагается , что файл содержит только действительныеint
значения, если оно вам не будетеfail
бит все еще установлен наinputFile
и должен быть очищен, и обливание входные данные пропускаются , прежде чем продолжить).