如何在标准输入上强制执行EOF?

8

对于一个C++应用程序,我该如何在程序中强制结束标准输入(stdin)的输入流?


你说的“强制在stdin上使用EOF”是什么意思?你可以关闭stdin(或cin)。你可以单方面终止循环。你可以寻找文件的结尾(但这对于终端或管道作为输入是没有帮助的)。你可能可以通过freopen()来强制解决问题;重新分配标准输入以从/dev/null或NUL:读取。 - Jonathan Leffler
3个回答

17

如果你在类Unix系统的终端中,请按Ctrl-D。在Windows中,则是Ctrl-Z

编辑:看到想以“编程方式”完成此操作的愿望,我建议尝试使用fclose(stdin)。如果不行,一个更疯狂的想法可能是使用std::cin.rdbuf()将流(stream)设置为引用真正的stdin之外的其他东西,然后对该流进行操作。但这开始有点不好,就像你正在与计算机斗争一样,因此我想了解更多关于实际目标的信息。


但这是在一个C++应用程序中,那么发送Ctrl-D会起作用吗? - WilliamKF
哦,我现在明白“以编程方式”了。也许你可以更详细地描述一下你想做什么? - John Zwinck
我正在尝试解决的问题是:http://stackoverflow.com/questions/4701282/how-to-figure-out-why-ssh-session-does-not-exit-sometimes - WilliamKF
1
啊哈!那么真正的解决方案是使用libsshlibssh2,而不是仅从C中调用popen()来调用ssh(1),后者本身又是另一个C程序。去掉中间人! - John Zwinck
@JohnZwinck,但是Ctrl-Z对我不起作用,它给了我一个^Z,怎么回事? - Alcott

7

实际上,你做不到。只要你可以从标准输入读取数据,EOF就永远不会被触发。但是你可以关闭stdin。要关闭它,请执行以下操作:

fclose(stdin);

接下来,您将无法从stdin读取数据。


1

对于每个流,都有一个特别为此创建的小函数可用。



它的语法大致如下:

      stream.setstate(stream.flags)


所以在你的代码中,你可以有一个简单的条件触发类似以下的操作:

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


这方面的文档相当稀少,但cppreference.comcplusplus.com上有一些相关内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接