Input 如何在D编程语言+;探戈

Input 如何在D编程语言+;探戈,input,d,tango,Input,D,Tango,我读了这篇文章,试图用D编程语言做这个练习,但在第一个练习中遇到了一个问题 (1) 显示数字系列 (1,2,3,4,5…等)在无穷远处 环如果出现以下情况,程序应退出: 有人按了一个特定的键(比如 退出键) 当然,无限循环不是一个大问题,但其余的问题是。我怎样才能在D/Tango中抓住关键点?在tango FAQ中,它说使用C函数kbhit()或get(),但正如我所知,这些函数不在C标准库中,也不存在于我用来编程的Linux机器附带的glibc中 我知道我可以使用像这样的第三方库,但它也有同样

我读了这篇文章,试图用D编程语言做这个练习,但在第一个练习中遇到了一个问题

(1) 显示数字系列 (1,2,3,4,5…等)在无穷远处 环如果出现以下情况,程序应退出: 有人按了一个特定的键(比如 退出键)

当然,无限循环不是一个大问题,但其余的问题是。我怎样才能在D/Tango中抓住关键点?在tango FAQ中,它说使用C函数kbhit()或get(),但正如我所知,这些函数不在C标准库中,也不存在于我用来编程的Linux机器附带的glibc中

我知道我可以使用像这样的第三方库,但它也有同样的问题,就像kbhit()或get(),它不是C或D中的标准库,也不是预装在Windows上的。我希望我可以只用D/Tango完成这个练习,并且可以在Linux和Windows机器上运行它


我该怎么做呢?

D通常有所有的C标准lib可用(Tango或Phobos),因此GNU C的这个问题的答案也应该用D来回答


如果tango没有所需的函数,那么生成绑定就很容易了。(看一看CPP,就可以切掉任何宏垃圾。)

kbhit确实不是任何标准C接口的一部分,但可以在conio.h中找到


但是,您应该能够使用tango.stdc.stdio中的getc/getchar-我更改了您提到的常见问题解答以反映这一点。

感谢您的两个回复

不幸的是,我的主要开发环境是Linux+GDC+Tango,所以我没有conio.h,因为我没有使用DMC作为我的C编译器

我还发现getc()和getchar()在我的开发环境中也是行缓冲的,所以它无法实现我所希望的

最后,我使用GNU ncurses库完成了这个练习。由于D可以直接与C库接口,所以不需要花费太多精力。我只是声明了我在程序中使用的函数原型,调用这些函数并将我的程序直接链接到ncurses库

它在我的Linux机器上运行得很好,但我仍然不知道如果没有任何第三方库,我怎么能在Linux和Windows上运行

import tango.io.Stdout;
import tango.core.Thread;

// Prototype for used ncurses library function.
extern(C)
{
    void * initscr();
    int cbreak ();
    int getch();
    int endwin();
    int noecho();
}

// A keyboard handler to quit the program when user hit ESC key.
void keyboardHandler ()
{
    initscr();
    cbreak();
    noecho();
    while (getch() != 27) {
    }
    endwin();
}

// Main Program
void main ()
{
    Thread handler = new Thread (&keyboardHandler);
    handler.start();

    for (int i = 0; ; i++) {
        Stdout.format ("{}\r\n", i).flush;

        // If keyboardHandler is not ruuning, it means user hits
        // ESC key, so we break the infinite loop.
        if (handler.isRunning == false) {
            break;
        }
    }

    return 0;
}

以下是如何使用D编程语言进行此操作:

    import std.c.stdio;
    import std.c.linux.termios;

    termios  ostate;                 /* saved tty state */
    termios  nstate;                 /* values for editor mode */

    // Open stdin in raw mode
    /* Adjust output channel        */
    tcgetattr(1, &ostate);                       /* save old state */
    tcgetattr(1, &nstate);                       /* get base of new state */
    cfmakeraw(&nstate);
    tcsetattr(1, TCSADRAIN, &nstate);      /* set mode */

   // Read characters in raw mode
    c = fgetc(stdin);

    // Close
    tcsetattr(1, TCSADRAIN, &ostate);       // return to original mode

正如Lars所指出的,您可以使用conio.h中定义并在(我相信)msvcrt for Windows中实现的_kbhit和_getch。这是一个例子