【问题标题】:C++ making sure there is absolutely no stdin bufferingC++ 确保绝对没有标准输入缓冲
【发布时间】:2016-04-21 08:05:11
【问题描述】:

在 C++ 中,是否可以绝对NO对标准输入进行缓冲?

在 Linux 中,您必须首先将您正在使用的终端设置为非规范模式,方法是使用 termiosncurses 库。

在 Windows 中,您需要向我们提供仅限 Windows 的 conio.h

是否有可能有一个简单的、跨平台的语句,只使用标准 C++ 来确保标准输入中发生的绝对一切都是实时发生的,并且可以在我的程序是实时的吗?

这意味着:等待回车或换行来解析输入,尝试处理转义字符,抛出适合不可打印的字符等。

我需要这样的东西:

setvbuf(stdin, NULL, _IONBF, 0);

但终端无论如何都会等待换行符或回车。

真的没有办法在没有外部库的情况下获得绝对原始的键盘输入吗?

如果有人可以为此提供某种内联汇编或原始 C++ 解决方案,那就太好了。

【问题讨论】:

  • 本题请选择 C ​​和 C++ 之一。此外,终端配置独立于 stdio 缓冲。
  • 不,没有真正可移植的方式(这就是为什么为此目的存在 100 多个库的原因),甚至汇编也无法帮助您。说真的,组装应该怎么做?
  • 投反对票,因为没有称为 C/C++ 的语言。请至多选择 C ​​和 C++ 中的一种,除非您的问题专门针对两者的交互。
  • 在某些系统上,终端确实位于数千英里之外的终端,并进行自己的缓冲。编程语言对此无能为力。

标签: c++ c stream buffer stdin


【解决方案1】:

不,仅使用标准 C/C++ 代码就不可能有一个简单的跨平台语句来解决您的问题。这是因为您不仅关心程序内的缓冲,还关心程序运行时环境(包括操作系统)完成的缓冲。根据环境的不同,您的程序可能根本无法做到这一点!

具体来说,我认为 C 和 C++ 标准库没有这样的功能。我认为这是有充分理由的:I/O 设施的细节在不同操作系统之间差异很大,目前还不清楚您将如何以一种定义明确、可实施的方式来指定这样的要求。

请注意,缓冲是可以在任何阶段添加的。这是文件系统更一般的 I/O 的问题:在什么时候您可以确定您的文件写入已被推送到磁盘?即使您向sync 文件系统发出操作系统命令,您的存储设备中的固件也会及时刷新其缓冲区...

【讨论】:

  • 也不能保证您的程序可以访问具有此功能的标准输入。
猜你喜欢
  • 2013-11-28
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多