【问题标题】:Reading std::cin hangs if no pipe is provided如果没有提供管道,读取 std::cin 会挂起
【发布时间】:2017-12-14 11:26:40
【问题描述】:

我有一个一般形式的函数

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()。

【问题讨论】:

  • 它没有挂;它只是在等待输入。
  • 嗯,是的,但不会有任何......
  • 这是所有命令的正常行为。尝试在您的终端上只执行cat,您会看到它会等待输入,直到您发送 EOF。
  • 所以没有办法在我的代码中做到这一点?
  • 您可以使用isatty 来检查您的程序是否通过管道传输或正在从终端读取输入。

标签: c++ istream


【解决方案1】:

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

当您将cat 命令的stdout 传送到程序的stdin 时,您的stdin 中有一个EOF。这将导致设置eof 标志,进而导致while(input>>var) 失败;因此退出循环。

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

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

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2021-02-28
    相关资源
    最近更新 更多