首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:getline在文件末尾冻结

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

Stack Overflow用户
提问于 2017-08-29 05:09:48
回答 1查看 1K关注 0票数 4

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

这个循环成功地写入了文件中的每一行,但是它在最后的getline调用中被卡住了。因此,“已完成”不会写入文件,程序也不会终止。

代码语言:javascript
复制
#include <string>
#include <iostream>
using namespace std;

int main() {

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

    cout << "Done";  

    return 0;
}

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

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

注释:中的输入文件以换行符结尾。此外,我不想使用除这两种以外的任何包括在内。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-29 17:36:04

代码应该在文件结束(EOF)或任何类型的文件错误时终止。(调用的getline是:string/getline,它返回cin istream,然后调用它的布尔转换运算符:bool/,用于检查流上是否设置了坏位或故障位。当尝试读取时,如果流已经在EOF,或者如果有错误,则应该设置failbit状态。)

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45931081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档