残培和的putChar不工作没有回报(getch and putchar not working w

2019-06-23 19:39发布

我一直在试图让getch在没有成功的另一个程序的工作。 所以我做了我可以用最基本的程序getch我希望它在主程序中的工作方式。

我研究的需要noechocbreakinitscrnodelay ,我也尝试使用newscr()但没有成功。

我遇到的问题是,字符不被显示在屏幕上,直到我打“进”,当他们应该put每一个循环的屏幕。 这究竟是为什么? 另外,光标不会在新线返回到屏幕的左侧。 例如。

abc  
   def
      ghi

我一直在寻求答案,但我再次难倒...

#include <stdio.h>
#include <ncurses.h>

int main()
  {
     initscr();cbreak(); noecho();nodelay(stdscr,0);
    char c ;
    while((c=getch())!=EOF){
    putchar(c);}

    return 0;
  }

Answer 1:

你没有看到输出,因为你的stdout流线缓冲。

你的程序越来越单个字符的所有权利; 但输出流被缓冲。

尝试fflush(stdout); 或切换stdout到缓冲模式与setbuf(stdout, NULL);

与禁用缓冲的问题是,它是低效率的批量数据处理时的输出是不是一个终端。

你可以把它有条件在标准输出是一个TTY:

if (isatty(fileno(stdout)))  /* #include <unistd.h> */
  setbuf(stdout, NULL);

要返回光标到行的开始,你需要拿出一个回车\r 。 这是因为,诅咒cbreak模式已禁用ONLCR TTY模式(输出,发送时NL添加CR)。

如果无条件地添加\r ,那么当你的输出重定向它将出现在文件中。 所以,再一次,你需要一些isatty黑客。

一个更好的可能是学习如何使用tcgetattrtcsetattr函数来精确控制特定tty参数,如果你想要的是做字符在-A-时间输入无回声,并没有真正建立一个互动的基于光标的计划。

难道你真的想要的字符在-A-时间输入,或者只是魔鬼的回声? 这很容易禁止回声。 调用tcgetattr填充struct termios与文件描述符0的当前设置(如果它是一个TTY)。 翻转一些标志关闭呼应,然后调用tcsetattr安装更新的结构。 当你的程序退出,是好的,放回到原来的一个。 完成。



Answer 2:

是的,ncurses的是一个很好的方式来获得字符一个字符的控制。

是的,你必须调用 “initscr的()” 和 “CBREAK()”。

几点建议:

1)比较你的代码与此NCURSES的 “Hello World”:

#include <ncurses.h>

int main()
{   
    initscr();          /* Start curses mode          */
    printw("Hello World !!!");  /* Print Hello World          */
    refresh();          /* Print it on to the real screen */
    getch();            /* Wait for user input */
    endwin();           /* End curses mode        */

    return 0;
}

2)看看你做一个“刷新()”和/或删除“NOECHO()”发生了什么。

3)本教程有很多很好的信息,可能也有帮助:

http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/



文章来源: getch and putchar not working without return