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