繁体   English   中英

如果没有提供管道,则读取std :: cin会挂起

[英]Reading std::cin hangs if no pipe is provided

我具有一般形式的功能

void readStuff(std::istream& input){
    int var;
    while(input>>var){
        //... do stuff
    }
}

输入是否以std :: cin或std :: ifstream的形式传递,具体取决于是否设置了命令行选项-c。 从文件读取

myprog file.txt

工作正常。 如果使用std :: cin,

cat file.txt | myprog -c

效果也很好。 但是,如果用户尝试将其挂起

myprog -c

如何在我的代码中处理这种情况? 我试过检查ifstream的标志,但是在所有情况下它们都为0,除了ifstream.good()。

您的程序没有挂起; cin只是在等待来自终端的输入。

当管道cat命令的stdout到你的程序的stdin ,有一个EOF在你的stdin 这将导致设置eof标志,从而导致while(input>>var)失败; 因此退出循环。

当您直接从终端执行程序时, cin会一直等待来自终端的输入,直到输入流关闭为止。 您可以通过在终端上发送EOF来退出程序,这将关闭输入流,这又会中断代码中的循环。

如果希望程序不在管道中而退出,则可以在POSIX系统上使用isatty进行检查,在Windows上使用_isatty进行检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM