Как рассчитать сумму и среднее число из текста.doc

0

Мне было предложено написать программу, чтобы открыть 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.

  • 6
    Вы уже запустили inputFile для eof с первым циклом. Второй цикл ничего не сделает для вас. (предполагается , что файл содержит только действительные int значения, если оно вам не будете fail бит все еще установлен на inputFile и должен быть очищен, и обливание входные данные пропускаются , прежде чем продолжить).
  • 0
    Исследование целочисленного деления в зависимости от числа с плавающей запятой.
Теги:

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

Если вы утверждаете, что файл большой: в этом случае вы действительно не хотите читать файл более одного раза и не хотите хранить его в контейнере, т.е. Обрабатывать файл за один проход, Поскольку задача, стоящая перед нами, делает ее довольно тривиальной и, безусловно, вполне осуществимой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню