i/o file not being read completely to console's results

The "scores.txt" contains 12 items in the file, that should sum up to 204.5 and have average of 17.0417

The program doesn't appear to be reading the last value of the file.

How come?

source.txt:
18 19 18.5 13.5 14
16 19.5 20 18 12 18.5
17.5


The console's output:

Enter name of the data file: scores.txt
End of the file reached.
Items read: 11
Sum: 187
Average: 17
Press any key to continue . . .


The code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//sumafile.cpp -- functions with an array argument
#include <iostream>
#include <fstream>	//file I/O support
#include <cstdlib>	//support for exit()
const int SIZE = 60;
int main()
{
	using namespace std;
	char filename[SIZE];
	ifstream inFile;	//object for handling file input

	cout << "Enter name of the data file: ";
	cin.getline(filename, SIZE);
	inFile.open(filename);	//associate inFile with a file
	if (!inFile.is_open())	//failed to open file
	{
		cout << "Could not open the file " << filename << endl;
		cout << "Program terminating.\n";
		exit(EXIT_FAILURE);
	}
	double value;
	double sum = 0.0;
	int count = 0;	//number of items read

	inFile >> value;	//get first value
	while (inFile.good())	//while input good and not at EOF
	{
		++count;	//one more item read
		sum += value;	//calculate running total
		inFile >> value;	//get next value
	}
	if (inFile.eof())
		cout << "End of the file reached.\n";
	else if (inFile.fail())
		cout << "Input terminated by data musmatch.\n";
	else
		cout << "Input terminated for unkown reason.\n";
	if (count == 0)
		cout << "No data processed.\n";
	else
	{
		cout << "Items read: " << count << endl;
		cout << "Sum: " << sum << endl;
		cout << "Average: " << sum / count << endl;
	}
	inFile.close();	//finished with the file
	system("pause");
	return 0;
}
Last edited on
I'm taking a wild guess and suggesting that your loop is the problem. The last value is probably being read and the good function returns false due to the eof bit having been set. Therefore the count and sum doesn't get updated. Try changing the stream operation to the first thing within the loop and get rid of the operation right before the loop. This way the last item will be counted, I think.
Oh right.
Thanks.
Topic archived. No new replies allowed.