从D中的stdin中读取单个字符



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

如何从stdin中读取单个字符?

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

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

  • 使用rawReadbyChunk来缓冲它的一个块(stdinstd.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,它提供了一个结构体来为您更改缓冲模式,以及getchkbhit等函数,类似于链接中的旧conio.h。下面是一个示例文件:http://arsdnet.net/dcode/book/chapter_12/07/input.d,其中显示了一个简单的"按任意键继续"示例。

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

相关内容

  • 没有找到相关文章

最新更新