【问题标题】:Unbuffered I/O in ANSI CANSI C 中的无缓冲 I/O
【发布时间】:2009-10-30 03:50:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: c input c89 unbuffered


    【解决方案1】:

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

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

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

    【讨论】:

    • 我担心那是我必须做的...我想我会继续的... windows.h 中的 win32API 是什么?感谢您的指导.. :)
    【解决方案2】:

    要使用 ANSI C 将打开的流设置为非缓冲,您可以这样做:

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

    (参考:C89 4.9.5.6)

    但是,在那之后,您就只能靠自己了。 :-)

    【讨论】:

    • setvbuf() 的第一个参数是 C 文件句柄,而不是文件描述符。
    • 我使用了这个示例,它可以确保 C 库不会从流中读取超出所需的内容,从而使流的其余部分保持不变以供管道中的后续进程使用。
    【解决方案3】:

    仅使用标准 ISO C 是不可能的。但是,您可以尝试使用以下方法:

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

    及相关功能。

    不过,最好的办法是使用 ncurses 库。

    【讨论】:

    • 那里还有一个不错的 Windows 开源诅咒;谷歌“pdcurses”。通过这种方式,完全有可能针对诅咒进行编码,并最终在提问者要求的所有平台上都可以工作——我已经做到了。
    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多