Question

Here is my code:

#include <iostream>
#include <stdlib.h>
#include <fstream>

using namespace std;

int main() {
    string line;
    ifstream inputFile;
    inputFile.open("input.txt");

    do {
        getline(inputFile, line);
        cout << line << endl;
    } while (line != "0");

    return 0;
}

input.txt content:

5 9 2 9 3
8 2 8 2 1
0

In Enclipse, it goes to infinite-loop. I'm using MinGW 5.1.6 + Eclipse CDT.

I tried many things but I couldn't find the problem.

Was it helpful?

Solution

Since you are on windows try:

} while (line != "0\r");

The last line is stored as "0\r\n". The \n is used as the line delimiter by getline so the actual line read will be "0\r"

or

you can convert the dos format file to UNIX format using command

dos2unix input.txt

Now your original program should work. The command will change the \r\n at the end of the line to \n

Also you should always do error checking after you try to open a file, something like:

inputFile.open("input.txt");
if(! inputFile.is_open()) {
 cerr<< "Error opening file";
 exit(1);
}

OTHER TIPS

It will create an infinite loop if no line contains exactly 0. For example 0\n is not the same thing as 0. My guess is that that is your problem.

EDIT: To elaborate, getline should be discarding the newline. Perhaps the newline encoding of your file wrong (i.e. windows vs. unix).

Your main problem is working directory.
Because you are specifying a file using a relative path it searches for the file from the current working directory. The working directory can be specified by your dev environment. (Note: The working directory is not necessarily the same directory where the executable lives (this is a common assumption among beginners but only holds in very special circumstances)).

Though you have a special end of input marker "0" you should also check that the getline() is not failing (as it could error out for other reasons (including beady formatted input). As such it is usually best to check the condition of the file as you read it.

int main()
{
    string   line;
    ifstream inputFile;
    inputFile.open("input.txt");

    while((getline(inputfile, line)) && (line != "0"))
    {
        // loop only entered if getline() worked and line !="0"
        // In the original an infinite loop is entered when bad input results in EOF being hit.

        cout << line << endl;
    }
    if (inputfile)
    {
        cout << line << endl; // If you really really really want to print the "0"
                             // Personally I think doing anything with the termination
                             // sequence is a mistake but added here to satisfy comments.
    }

    return 0;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow