C++ 如果未提供管道,则读数std::cin挂起

C++ 如果未提供管道,则读数std::cin挂起,c++,istream,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 那也行。但是,如

我有一个一般形式的函数

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。

您的程序没有挂起
cin
正在等待来自终端的输入

当您通过管道将
cat
命令的
stdout
传输到程序的
stdin
中时,在
stdin
中有一个
EOF
。这将导致设置
eof
标志,这反过来将导致
while(输入>>var)
失败;因此退出循环

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


如果希望程序在不在管道中时退出,可以检查POSIX系统和Windows上的使用情况。

您的程序没有挂起
cin
正在等待来自终端的输入

当您通过管道将
cat
命令的
stdout
传输到程序的
stdin
中时,在
stdin
中有一个
EOF
。这将导致设置
eof
标志,这反过来将导致
while(输入>>var)
失败;因此退出循环

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


如果希望程序在不在管道中时退出,可以检查POSIX系统和Windows上的使用情况。

它没有挂起;它只是在等待输入。是的,但不会有任何…这是所有命令的正常行为。尝试在您的终端上执行
cat
,您将看到它等待输入,直到您发送EOF。因此,在我的代码中无法执行此操作?您可以使用来检查您的程序是否已通过管道传输或正在从终端读取输入。它没有挂起;它只是在等待输入。是的,但不会有任何…这是所有命令的正常行为。尝试在您的终端上执行
cat
,您将看到它等待输入,直到您发送EOF。因此,在我的代码中无法执行此操作?您可以使用检查您的程序是否已通过管道传输或正在从终端读取输入。