如果没有提供管道,读取 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 时,您的 stdin 中有一个 EOF。这将导致设置 eof 标志,进而导致 while(input>>var) 失败;因此退出循环。

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

如果您希望您的程序在不在管道中时退出,您可以在 Windows 上使用 isatty on POSIX systems and _isatty 检查。