Question regarding using eof in a while loop.

My professor assigned us a project that requires us to use "eof" (quotation marks for emphasis) in a "while" loop. I have done quite a bit of research and realize why I have the issue I will relate in a bit. However, using "eof" is part of what will determine my grade, meaning that even though I am aware that I could achieve what I need using other code, I must use eof in this case.

I also understand that there are other more elegant, and effective, ways to write the program that will accomplish what I need, but that is a battle for another day. I need to focus on my issue with "eof" for now.

When using "eof", I have noticed that my program outputs the last set of data twice. As I understand, the loop checks for eof only after it reads the file, which causes it to repeat the last set of data.

What I need to accomplish is to use "eof" without repeating the last set of data twice in order to accomplish what my professor expects.

The code I wrote follows below.

Thanks in advance for your assistance.

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <fstream> // File stream (output and input to a file).
#include <iomanip> // Output and input manipulation.

using namespace std;

int main()
{
// char variables will be set to up to 20 characters.
ifstream inData; // Variable that will store input file stream data.
ofstream outData; // Variable that will store output file stream data.
char exit; //Variable that will be used to terminate program.
char fiName [20]; // Variable that will store the name of the file the user creates.
char firstName [20]; // Variable that will store the first names.
char lastName [20]; // Variable that will store last names.
double gradeA, gradeB, gradeC, gradeD, gradeE; //variables that will store grades.
double average; // Variable that will be used to calculate average grade.
int roundedAverage; // Variable that will be used to round calculated average to an integer.
int counter1; // Variable to start for loop that will request user to input data 5 times.
int counter2=0; // Variable to start while loop that will check user for invalid input.
                // It is set to begin at 0 to allow for 3 attempts.

// Request user input file name to create file.
cout << "\n Please enter a file name to store information and press enter: ";
cin >> fiName;
cout << "\n You set your file name to: " << fiName << "\n";

    outData.open (fiName); //Open file created by user to write into it.
        //Request data from user.
        cout << "\n\n Enter first name and press enter: ";
        cin >> firstName;
        cout <<"\n Enter last name and press enter: ";
        cin >> lastName;
        cout << "\n Enter five grades separated by a space and press enter: ";
        cin >> gradeA >> gradeB >> gradeC >> gradeD >> gradeE;
        // Write data entered by user into the file.
        outData << firstName << " " << lastName << " ";
        outData << gradeA << " " << gradeB << " " << gradeC << " " << gradeD << " " << gradeE << " ";
    for (counter1=0;counter1<4;counter1++) //For loop to ask and store names and grades four more times.
    {
        //Request data from user.
        cout << "\n\n Enter another first name and press enter: ";
        cin >> firstName;
        cout <<"\n Enter another last name and press enter: ";
        cin >> lastName;
        cout << "\n Enter five grades separated by a space and press enter: ";
        cin >> gradeA >> gradeB >> gradeC >> gradeD >> gradeE;
        // Write data entered by user into the file.
        outData << firstName << " " << lastName << " ";
        outData << gradeA << " " << gradeB << " " << gradeC << " " << gradeD << " " << gradeE << " ";
    }
    outData.close (); // Close file created by user once it contains all requested data.

// Request user to input file name to open file.
cout << "\n\n Enter file name to read and press enter: ";
cin >> fiName;

    inData.open(fiName); //Open file created by user to read from it.
        // While loop to check for incorrect file name.
        // It will display an error message, up to three times, before terminating
        // if the user conitnues to enter the wrong file name.
        while (!inData&&counter2<2)
        {
            cout << "\n File not found." << endl;
            cout << "\n Reenter file name: ";
            cin >> fiName;
            inData.open (fiName);
            counter2++;
        }
            // if statement to terminate program in case user enters incorrect
            // file name three times.
            if (!inData)
            {
                cout << "\n File not found. Program Terminated.";
                /*On my notes, a break; statement followed the statement above, but the
                compiler told me that I could not use break with an if statement. My
                solution to terminate the program at this point was to use the three
                lines of code below.*/
                cout << "\n\n To exit the program, enter any key and press enter: ";
                cin >> exit;
            }

        while (!inData.eof())
        {
        // Read data entered by user from file in the same order it was stored.
        inData >> firstName >> lastName >> gradeA >> gradeB >> gradeC >> gradeD >>gradeE;
            cout << "\n Name: " << firstName << " " << lastName;
            cout << "\n Grades: " << gradeA << ", " << gradeB << ", " << gradeC << ", ";
            cout << gradeD << ", " << gradeE;

        // Calculate and display average grade.
        average=(gradeA+gradeB+gradeC+gradeD+gradeE)/5.0; //Calculate average grade.
            cout << "\n " << firstName << " " << lastName << "'s" <<" average grade is: ";
            cout << average; //sets output width to six characters.
        roundedAverage=average+0.5; // Round average grade to an integer.
            cout << "\n Rounded and final grade is: " << roundedAverage << "\n\n";

        }
    inData.close();

    cout << "\n To exit the program, enter any key and press enter: ";
    cin >> exit;

    return 0;
}


I tried placing:
1
2
 if (inData.eof())
break;

Just before the end of the loop, hoping it would check then and not repeat the last line, but it did not work.
Last edited on
closed account (48T7M4Gy)
Try using this, otherwise wait around because you are about to experience an avalanche of peeks and reasons why you shouldn't use it (and quite rightly so as a general rule) but that doesn't help you much if you have an uber-dominant lecturer.

http://www.cplusplus.com/reference/ios/ios/eof/

http://stackoverflow.com/questions/21647/reading-from-text-file-until-eof-repeats-last-line
Last edited on
While in most circumstances using eof() to control input loops is a bad idea it is possible to use eof() if done properly.

What you will need to do is pre-read the information before the loop, the at the end of the loop read another time:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    ifstream fin("datafile.txt");
    // You must insure the file opened correctly! A failure of opening the file will not be caught by just testing for eof.
    if(!fin)
    {
       cout << "Input file failed to open.\n";
       return 1
    }
    // Read a set of data before the loop.
    fin >> data;
    // Use fail() to insure that there are no read failures.
    while(!fin.eof() || fin.fail())
    {
        // Do what ever with the data here.

        // At the end of the loop read another set of data.
        fin >> data;
    }




Got it, and it worked.

Thank you all for the help. I am still very new to programming in general and would love to learn how to do things the most effective way. As I said before, I realize that there are many things I could do to improve the code, but I simply don't know enough to do it at the moment, and I also had no other option but to use the feature my professor expected.

I am glad that I found these forums.
closed account (48T7M4Gy)
Have a look at the tutorials on this site and here is the section on input and output from files as a start.

http://www.cplusplus.com/doc/tutorial/files/
Topic archived. No new replies allowed.