2

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;
}
4

2 回答 2

1

问题是只打印最后一行。正确的?

  1. 我建议您std::endl在 while 循环中添加。它可以使问题更清楚。有时输出可能会令人困惑。
  2. 您还可以检查输入文件中的行分隔符。'\n'是 的默认分隔符getline。如果使用不同的字符,请将其指定为getline的第三个参数。
于 2013-05-21T01:56:05.213 回答
1

来自cplusplus.com

如果找到分隔符,则将其提取并丢弃,即不存储,然后开始下一个输入操作。

由于您的原始代码片段本身没有插入任何额外的换行符,因此没有任何内容使终端的输出转到下一行。当输出用完水平空间时,接下来发生的事情取决于终端。我不确定您使用的是什么终端,但在您的情况下,它只是将光标回绕到该行的第一个字符而没有换行符。在 Windows 命令外壳上,它只是环绕到下一行。

另请注意:

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

是一种常见的反模式。正如已经指出的,更合适的是:

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

文件流只有在您达到 eof 并尝试从中读取后才会变为 false。

于 2013-05-21T03:43:26.430 回答