此代码始终打印文件的最后一行。我希望它能从文件中一次打印所有文本,一行一行。知道为什么它不起作用吗?
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();
以这种方式尝试同样的事情:
for (string line; getline(afile, line);) {
cout << line;
}
也许这是我的终端的问题?这有效......
for (string line; getline(afile, line);) {
cout << line << endl;
}
答案 0 :(得分:1)
问题是只打印最后一行。正确的吗?
std::endl
。它可以使问题更加清晰。有时输出可能会令人困惑。'\n'
是getline
的默认分隔符。如果使用其他字符,请将其指定为getline
的第3个参数。答案 1 :(得分:1)
如果找到分隔符,则将其提取并丢弃,即它 没有存储,下一个输入操作将在它之后开始。
由于您的原始代码段本身没有插入任何额外的换行符,因此没有任何内容可以使终端的输出转到下一行。当输出用完水平空间时,接下来发生的是终端。我不确定你使用的终端是什么,但在你的情况下,它只是将光标包回到该行的第一个字符而没有换行。在Windows命令shell上,它只是绕到下一行。
另请注意:
while(!afile.eof()) {
getline(afile, line);
cout << line;
}
是一种常见的反模式。正如已经指出的那样,更合适的是:
while(getline(afile, line)) {
cout << line << '\n';
}
文件流在您到达eof并尝试从中读取后才会变为false。