std.stdio
的{{3}}未列出read
函数,该函数可用于从标准输入中获取单个字符,仅readln
获取一行。 std.file
具有read
功能,但它需要一个文件名,据我所知,该名称不适用于标准输入。
如何阅读stdin
中的单个字符?
答案 0 :(得分:4)
一些选项,具体取决于您的需求:
如果你只想要一个字符用于编程,但不要介意它是行缓冲的:
使用rawRead
或byChunk
缓冲其中的一个块(stdin
是std.stdio.File
的一个实例,因此该http://dlang.org/phobos/std_stdio.html区域的所有方法都是如此它也是可用的)并且一次从该数组中读取一个项目。
使用fgetc
的{{1}}并使用C stdin而不是D包装器。它们彼此兼容,所以从一个人那里读书不会搞砸另一个人的缓冲。
使用import core.stdc.stdio;
功能一次抓取一个数据。
所有这些选项都适用于您的程序,但您会注意到用户仍然必须在程序执行任何操作之前按Enter键,因为基础输入流一次缓冲到一个完整的行。这也可以改变:
如果您想立即使用一个密钥,请与用户进行交互式会话:
请参阅评论中的CyberShadow链接
使用操作系统调用禁用行缓冲。 Posix上的readf
和Windows上的tcsetattr
- 在网上搜索有关如何在C中禁用行缓冲的详细信息,相同的代码可以很容易地转换为D.另请参阅我的源代码执行它的terminal.d:https://github.com/adamdruppe/arsd/blob/master/terminal.d#L1078
只需使用一个库,比如我的terminal.d,它提供了一个结构来改变你和SetConsoleMode
和getch
等函数的缓冲模式,类似于旧的{{1在链接中。这是一个示例文件:http://arsdnet.net/dcode/book/chapter_12/07/input.d,显示一个简单的"按任意键继续"示例
使用功能更强大的C库,例如来自D的kbhit
http://code.dlang.org/packages/ncurses如果您曾经使用过它,那么它几乎是相同的。