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