ANSI C中的无缓冲I / O.

为了教育和编程实践,我想编写一个简单的库,可以处理原始键盘输入,并“实时”输出到终端。

我想尽可能地坚持使用ansi C,我只是不知道从哪里开始这样的事情。 我已经完成了几次谷歌搜索,99%的结果使用了库,或者是用于C ++。

我真的很想让它在Windows中运行,然后在我有空的时候将它移植到OSX。

尽可能坚持使用标准C是一个好主意,但是你不会仅使用标准C来完成你所采用的任务。从终端一次获取字符的机制本质上是特定于平台的。 对于POSIX系统(MacOS X),请查看标头。 较旧的系统使用各种标头和系统调用来实现类似的效果。 你必须决定是否要进行任何特殊的字符处理,记住“行杀”之类的东西可以出现在行的末尾,并删除到目前为止输入的所有字符。

对于Windows,您需要深入研究WIN32 API – Unix和Windows之间的代码基本上没有共性,至少在将“终端”置于逐个字符模式的情况下。 一旦你有一个读取单个字符的机制,你可以管理公共代码 – 可能。

此外,您需要担心字符和按下的键之间的差异。 例如,要在MacOS X上输入“ï”,请键入选项-ui 。 这是三个关键的印刷机。

要使用ANSI C将开放流设置为非缓冲,您可以执行以下操作:

 #include  if (setvbuf(fd, NULL, _IONBF, 0) == 0) printf("Set stream to unbuffered mode\n"); 

(参考:C89 4.9.5.6)

然而,在那之后你就自己了。 🙂

仅使用标准ISO C无法做到这一点。但是,您可以尝试使用以下内容:

 #include  void setbuf(FILE * restrict stream, char * restrict buf); 

和相关的function。

你最好的选择是使用ncurses库。