C ++:getline在文件末尾冻结

时间:2017-08-29 05:09:48

标签: c++ io

我希望逐行读取一个文件并将我读取的每一行输出到一个新文件。在此代码中,cin已被重定向以引用输入文件,并且cout已被重定向以引用输出文件。

循环成功写入文件中的每一行,但随后它会卡在最后的getline调用上。因此,“Done”不会写入文件,程序也不会终止。

#include <string>
#include <iostream>
using namespace std;

int main() {

    string line;
    while(getline(cin, line)) {
        cout << line << endl;
    }

    cout << "Done";  

    return 0;
}

奇怪的是,如果我强行终止该程序,它似乎会按照需要突然执行,并写入“完成”。

有人能指出我正确的方向吗?代码中是否存在缺陷,或者这是一些外部配置问题?

注意:有问题的输入文件以换行符结尾。另外,除了这两个之外,我不想使用任何包含。

1 个答案:

答案 0 :(得分:1)

代码应终止于文件末尾(EOF)或任何类型的文件错误。 (被调用的getline是:     http://en.cppreference.com/w/cpp/string/basic_string/getline 它返回cin istream,然后调用它的布尔转换运算符:     http://www.cplusplus.com/reference/ios/ios/operator_bool/ 检查是否在流上设置了badbit或failbit。尝试读取时,如果流已经在EOF,或者出现错误,则应设置failbit状态。)

根据上面的评论,当代码直接从shell运行时,似乎这确实有效。我的猜测是Eclipse正在做一些复杂的事情,它要么故意将文件发送到程序然后切换到交互式输入模式,要么有一个错误,它不会关闭它的管道末端或pty / tty它用于向程序发送输入。 (即Eclipse在运行程序时没有将stdin直接绑定到文件本身。)

如果有人想进一步调试,可以使用像lsof这样的工具来查看流程状态。 (假设有一个UNIXy系统。)也许值得在Eclipse论坛中提出这个问题。 IDE不是我的专业领域。