繁体   English   中英

ANSI C中的无缓冲I / O.

[英]Unbuffered I/O in ANSI C

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

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

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

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

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

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

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

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

(参考:C89 4.9.5.6)

然而,在那之后你就自己了。 :-)

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

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

和相关的功能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM