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

时间:2017-12-14 11:26:40

标签: c++ istream

我有一般形式的功能

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的标志,但除了ifstream.good()以外,它们都是0。

1 个答案:

答案 0 :(得分:3)

你的节目不是悬而未决; cin正在等待来自终端的输入。

当您将cat命令stdout发送到您的stdin计划时,EOF中有一个stdin。这将导致设置eof标志,这反过来会导致while(input>>var)失败;因此退出循环。

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

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