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