使用getline()c ++从文件读取时遇到问题

时间:2013-05-21 01:28:27

标签: c++ file-io

此代码始终打印文件的最后一行。我希望它能从文件中一次打印所有文本,一行一行。知道为什么它不起作用吗?

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

2 个答案:

答案 0 :(得分:1)

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

  1. 我建议您在while循环中添加std::endl。它可以使问题更加清晰。有时输出可能会令人困惑。
  2. 您还可以检查输入文件中的行分隔符。 '\n'getline的默认分隔符。如果使用其他字符,请将其指定为getline的第3个参数。

答案 1 :(得分:1)

来自cplusplus.com

  

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

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

另请注意:

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

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

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

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