使用getline() c++读取文件时出现问题

Trouble reading from file using getline() c++

本文关键字:问题 文件 读取 getline c++ 使用      更新时间:2023-10-16

这段代码总是打印文件的最后一行。我希望它打印文件中的所有文本,每次一行。知道为什么不行吗?

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

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

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

From cplusplus.com:

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

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

还要注意:

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

是一个常见的反模式。如前所述,更合适的格式是:

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

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