【问题标题】:How do I force eof on stdin?如何在标准输入上强制 eof?
【发布时间】:2015-07-22 01:13:09
【问题描述】:

对于 C++ 应用程序,如何以编程方式强制标准输入上的文件结束 (EOF)?

【问题讨论】:

  • “在标准输入上强制 EOF”是什么意思?您可以关闭标准输入(或 cin)。你可以让你的循环单方面终止。您可以寻找到文件的末尾(但这对终端或管道作为输入没有帮助)。您也许可以使用freopen() 强制解决问题;重新分配标准输入以读取 /dev/null 或 NUL:.

标签: c++ stdin eof


【解决方案1】:

如果您使用的是类 Unix 系统的终端,请点击 Ctrl-D。在 Windows 中,Ctrl-Z

编辑:看到“以编程方式”执行此操作的愿望后,我建议尝试fclose(stdin)。如果这还不够好,一个更疯狂的想法可能是使用std::cin.rdbuf() 将流设置为引用真正标准输入以外的其他内容,然后对该流执行您想要的操作。但这开始闻起来很糟糕,就像你在和电脑打架一样,所以我想更多地了解真正的目标是什么。

【讨论】:

  • 但这是来自 C++ 应用程序,所以发送 Ctrl-D 有效吗?
  • 哦,我现在看到“以编程方式”。也许您可以更详细地描述您正在尝试做什么?
  • 我正在尝试解决:stackoverflow.com/questions/4701282/…
  • 啊哈!那么真正的解决方案是使用libsshlibssh2,而不是从C 调用popen() 只调用ssh(1),它本身就是另一个C 程序。砍掉中间商!
  • @JohnZwinck,但是 Ctrl-Z 对我不起作用,它给了我一个 ^Z,怎么了?
【解决方案2】:

实际上,你不能。只要您可以从标准输入读取数据,就没有到达 EOF,实际上您永远无法到达它。但是,您可以关闭 stdin 本身。要关闭它,请执行以下操作:

fclose(stdin);

在此之后,您将无法从stdin 读取数据。

【讨论】:

    【解决方案3】:

    每个专门为此创建的流都有一个不错的小功能。

    它的语法类似于:

          stream.setstate(stream.flags)
    


    因此,在您的代码中,您可以有一个简单的条件来触发以下内容:

          std::cin.setstate(std::cin.eofbit);
    


    这方面的文档非常少,但在 cppreference.comcplusplus.com 上有一些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2019-06-22
      • 2015-12-20
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多