从D中的stdin读取单个字符

时间:2014-08-15 20:51:08

标签: d phobos

std.stdio的{​​{3}}未列出read函数,该函数可用于从标准输入中获取单个字符,仅readln获取一行。 std.file具有read功能,但它需要一个文件名,据我所知,该名称不适用于标准输入。

如何阅读stdin中的单个字符?

1 个答案:

答案 0 :(得分:4)

一些选项,具体取决于您的需求:

如果你只想要一个字符用于编程,但不要介意它是行缓冲的:

  • 使用rawReadbyChunk缓冲其中的一个块(stdinstd.stdio.File的一个实例,因此该http://dlang.org/phobos/std_stdio.html区域的所有方法都是如此它也是可用的)并且一次从该数组中读取一个项目。

  • 使用fgetc的{​​{1}}并使用C stdin而不是D包装器。它们彼此兼容,所以从一个人那里读书不会搞砸另一个人的缓冲。

  • 使用import core.stdc.stdio;功能一次抓取一个数据。

所有这些选项都适用于您的程序,但您会注意到用户仍然必须在程序执行任何操作之前按Enter键,因为基础输入流一次缓冲到一个完整的行。这也可以改变:

如果您想立即使用一个密钥,请与用户进行交互式会话:

  • 请参阅评论中的Cyber​​Shadow链接

  • 使用操作系统调用禁用行缓冲。 Posix上的readf和Windows上的tcsetattr - 在网上搜索有关如何在C中禁用行缓冲的详细信息,相同的代码可以很容易地转换为D.另请参阅我的源代码执行它的terminal.d:https://github.com/adamdruppe/arsd/blob/master/terminal.d#L1078

  • 只需使用一个库,比如我的terminal.d,它提供了一个结构来改变你和SetConsoleModegetch等函数的缓冲模式,类似于旧的{{1在链接中。这是一个示例文件:http://arsdnet.net/dcode/book/chapter_12/07/input.d,显示一个简单的"按任意键继续"示例

  • 使用功能更强大的C库,例如来自D的kbhit http://code.dlang.org/packages/ncurses如果您曾经使用过它,那么它几乎是相同的。

    < / LI>