Chadburn Galentine
Chadburn Galentine

Reputation: 1

How do I calculate sum and average of numbers from a text.doc

I was asked to write a program to open a txt.doc and find the: number of numbers in the list, the sum and the avg. With I compile the code my valves equal zero. I cant find out where I went wrong.

#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;
 }

I don't know why my "numbers" "sum" "average" = zero.

Upvotes: 0

Views: 7366

Answers (1)

Dietmar K&#252;hl
Dietmar K&#252;hl

Reputation: 153935

The problem with your code is that you try to read the same file multiple times without getting it off the end: once the stream converts to false it will stay in this state until the stream state is cleared and ignore any real file operations. Also, even if you clear() the file's state it would go immediately back into failure state when an attempt to read data is made because either the next value is misformatted or the end of the stream is reached. You could clear() the state and seekg() to the beginning of the file, though (although I'm not recommending this approach):

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

Reading files is generally fairly expensive, not to mention that some sources for "files" can't be read multiple times (for example, a named pipe looks like a file but can be only read once). The cost comes from both the need to access the physical media and the, if that access is fast, the conversion internal to the program. Thus, you are best off to read the file just once and do all of the relevant calculations in the same pass. If combining these operations is deemed unreasonable, you might want to load the content into a container and then operated on the container:

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

In case you'd argue that the file is large: in this case you actually do not want to read the file more than once nor do you want to store it in a container, i.e., you'd process the file in a single pass. For the task at hand doing so is fairly trivial and certainly quite feasible.

Upvotes: 1

Related Questions