【问题标题】:C++: getline freezes at end of fileC ++:getline在文件末尾冻结
【发布时间】:2023-03-18 07:20:01
【问题描述】:

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

循环成功地写入了文件中的每一行,但随后卡在了最后的 getline 调用上。结果,“完成”不会写入文件,程序也不会终止。

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

int main() {

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

    cout << "Done";  

    return 0;
}

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

有人能指出我正确的方向吗?是代码有缺陷,还是外部配置问题?

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

【问题讨论】:

  • 你是如何调用程序的?
  • 我实际上无法重现错误
  • 我正在通过 Eclipse IDE 调用它。
  • 我可能错误地描述了这个问题。循环最终完成,但只有当我强行终止程序时(它不会自行完成)。这有什么意义吗?
  • 在最后一个输出中添加一个刷新:std::cout &lt;&lt; "Done\n" &lt;&lt; std::flush; 我猜,IDE 使窗口保持活动状态。

标签: c++ io


【解决方案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 的流时,或者出现错误时,应设置故障位状态。)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2016-03-18
    相关资源
    最近更新 更多