为了教育和编程实践,我想编写一个简单的库,可以处理原始键盘输入,并“实时”输出到终端。
我想尽可能地坚持使用 ansi C,我只是不知道从哪里开始这样的事情。我已经进行了几次谷歌搜索,99% 的结果使用库,或者用于 C++。
我真的很想让它在 Windows 中运行,然后在我有时间的时候将它移植到 OSX。
为了教育和编程实践,我想编写一个简单的库,可以处理原始键盘输入,并“实时”输出到终端。
我想尽可能地坚持使用 ansi C,我只是不知道从哪里开始这样的事情。我已经进行了几次谷歌搜索,99% 的结果使用库,或者用于 C++。
我真的很想让它在 Windows 中运行,然后在我有时间的时候将它移植到 OSX。
尽可能坚持使用标准 C 是一个好主意,但您不会仅使用标准 C 完成所采用的任务。每次从终端获取字符的机制本质上是特定于平台的。对于 POSIX 系统 (MacOS X),请查看<termios.h>
标题。较旧的系统使用各种各样的标头和系统调用来实现类似的效果。您必须决定是否要进行任何特殊字符处理,记住诸如“line kill”之类的内容可能会出现在行尾并删除到目前为止输入的所有字符。
对于 Windows,您需要深入研究 WIN32 API - Unix 和 Windows 之间的代码基本上没有共性,至少在您将“终端”设置为逐字符模式的地方。一旦你有了读取单个字符的机制,你就可以管理通用代码 - 可能。
此外,您需要担心字符和按下的键之间的差异。例如,要在 MacOS X 上输入 'ï',请键入option-uand i。那是三个按键。
要使用 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
库。