• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 696
  • Last Modified:

Handling errors in getline

I am able to load a file just fine with the following:

    char HoldLineData[300];
    ifstream fin(LOAD_FILENAME);

    while (!fin.eof()) {
        fin.getline(HoldLineData,300);
            // Process line here
        }
    }

However, if the streamsize is greater than 300 in one particular line, naturally getline will fail, and nasty things happen to the processing of the line.  So, I check for a failure as follow:

    char HoldLineData[300];
    ifstream fin(LOAD_FILENAME);

    while (!fin.eof()) {
        fin.getline(HoldLineData,300);
            if (fin.fail()) {
                fin.clear();
            } else {
                // Process line here
            }
        }
    }

This code runs fine, providing there is data in the final line of the program.  However, if the final line of the file is is empty, eof is not reached and my program crashes.  

Should I be using a different method of extracting data, or have I made an error in my code?
0
derekpapesch
Asked:
derekpapesch
1 Solution
 
efnCommented:
What I think is going on:

When the last line of input is non-empty, reading it sets eof and doesn't set fail, so the line gets processed and the loop terminates.

When the last line is empty, reading it sets both eof and fail.  The code then clears both eof and fail and so the loop continues indefinitely, reading, failing, and clearing.

I don't see how it would crash, but maybe this kind of loop is what you meant.  Or maybe your library works differently from the one with which I tested (Visual C++ 6.0).

To fix it, you could change the fail test to:

            if (fin.fail() && !fin.eof()) {

--efn
0
 
derekpapeschAuthor Commented:
Ahhh!  That is so logical, It didn't occur to me that eof was also cleared by my clear().  

You're right, it is a infinite loop, I was crashing out of the ap.  

Thanks a million!
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now