David Mulder
David Mulder

Reputation: 8017

Trouble reading from file using getline() c++

This code always prints the last line of the file. I expected it to print all the text, one line at a time, from the file. Any idea why it doesn't work?

string filename;
cout << "File to read: ";
cin >> filename;

ifstream afile;
afile.open(filename.c_str());

string line;
while(!afile.eof()) {
    getline(afile, line);
    cout << line;
}

afile.close();

Trying it this way does the same thing:

for (string line; getline(afile, line);) {
    cout << line;
}

Maybe this is an issue with my terminal? This works...

for (string line; getline(afile, line);) {
    cout << line << endl;
}

Upvotes: 2

Views: 4705

Answers (2)

greatwolf
greatwolf

Reputation: 20838

From cplusplus.com:

If the delimiter is found, it is extracted and discarded, i.e. it is not stored and the next input operation will begin after it.

Since your original code snippet doesn't insert any extra newlines itself, there is nothing making the output to the terminal go to the next line. When the output runs out of horizontal space what happens next is up to the terminal. I'm not sure what terminal you're using but in your case, it just wraps the cursor back to the first character on that line without a linefeed. On a windows command shell, it just wraps around to the next line.

Also note that:

while(!afile.eof()) {
    getline(afile, line);
    cout << line;
}

is a common antipattern. As already pointed out, more appropriate would be:

while(getline(afile, line)) {
    cout << line << '\n';
}

The file stream only becomes false after you've reached eof and try to read from it.

Upvotes: 1

ajtomato
ajtomato

Reputation: 26

The problem is that only the last line is printed. Correct?

  1. I suggest that you add std::endl in your while loop. It can make the issue more clear. Sometimes the output can be confusing.
  2. You can also check the line-delimiting character in your input file. '\n' is the default delimiter for getline. If a different character is used, specify it as getline's 3rd parameter.

Upvotes: 1

Related Questions