ANSI C中的无缓冲I / O.

时间:2009-10-30 03:50:28

标签: c input c89 unbuffered

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

此外,您还需要担心字符和按下的键之间的差异。例如,要在MacOS X上输入“ï”,请键入 option -u i 。这是三个关键的压力。

答案 1 :(得分:5)

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

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

(参考:C89 4.9.5.6)

然而,在那之后你就独自一人了。 : - )

答案 2 :(得分:2)

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

#include <stdio.h>
void setbuf(FILE * restrict stream, char * restrict buf); 

及相关功能。

最好的办法是使用ncurses库。

相关问题