3

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

如何从 中读取单个字符stdin

4

1 回答 1

4

几个选项,取决于你需要什么:

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

  • 使用rawReadorbyChunk缓冲它的一个块(它是http://dlang.org/phobos/std_stdio.html区域的所有方法stdin的一个实例)并一次从该数组中读取一个项目。std.stdio.File

  • fgetc通过import core.stdc.stdio;和使用 C 标准输入而不是 D 包装器来使用 C 函数。它们彼此兼容,因此从一个读取不会弄乱另一个的缓冲。

  • 使用该readf功能一次抓取一条数据。

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

如果您想立即使用一个键,例如与用户进行交互会话:

  • 在评论中查看 Cyber​​Shadow 的链接

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

  • 只需使用一个库,例如我的 terminal.d,它提供了一个结构来为您更改缓冲模式以及类似getchand之类的函数kbhit,类似于conio.h链接中的旧版本。这是一个示例文件:http ://arsdnet.net/dcode/book/chapter_12/07/input.d ,其中显示了一个简单的“按任意键继续”示例。

  • 使用ncursesD中功能更强大的 C 库。 http://code.dlang.org/packages/ncurses如果您曾经在 C 中使用过它,那几乎是一样的。

于 2014-08-16T13:03:34.307 回答