2

getch私は別のプログラムで仕事をしようとしてきましたが、うまくいきませんでした。getchそれで、メインプログラムで動作させたい方法で使用できる最も基本的なプログラムを作成しました。

noechocbreakinitscrおよびの必要性を調査しました。nodelay使用も試みnewscr()ましたが、成功しませんでした。

put私が抱えている問題は、ループごとに画面に表示する必要があるときに、「Enter」を押すまで文字が画面に出力されないことです。なぜこうなった?また、改行してもカーソルが画面左に戻りません。例えば。

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;
  }
4

2 に答える 2

7

stdoutストリームが行バッファリングされているため、出力が表示されません。

あなたのプログラムは個々の文字を正しく取得しています。しかし、出力ストリームはそれらをバッファリングしています。

でバッファなしモードにfflush(stdout);切り替えてみてください。stdoutsetbuf(stdout, NULL);

バッファリングを無効にすることの問題点は、出力が端末でない場合、大量のデータ処理が非効率になることです。

標準出力が tty であることを条件とすることができます。

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

カーソルを行頭に戻すには、改行を入れる必要があります\r。これは、curses のcbreakモードが tty モードを無効にしたためONLCRです (出力で、NL add CR を送信するとき)。

無条件に を追加する\rと、出力がリダイレクトされるときにファイルに表示されます。繰り返しになりますが、isattyハックが必要です。

対話型の curses ベースのプログラムを実際に開発するのではなく、エコーなしで一度に 1 文字ずつ入力することだけが必要な場合は、tcgetattrおよび関数を使用して特定の tty パラメーターを正確に制御する方法を学習することをお勧めします。tcsetattr

一度に一文字ずつ入力したいですか、それとも単にエコーを無効にしたいですか? エコーを無効にするのは簡単です。を呼び出しtcgetattrて、ファイル記述子 0 の現在の設定を astruct termiosに入力します (それが tty の場合)。いくつかのフラグを反転してエコーをオフにし、呼び出しtcsetattrて更新された構造をインストールします。プログラムが終了したら、親切にして元のプログラムに戻してください。終わり。

于 2012-04-21T05:38:16.163 に答える
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) 「refresh()」を実行したり、「noecho()」を削除したりするとどうなるかを確認してください。

3) このチュートリアルには役立つ情報がたくさんあります。

http://tldp.org/HOWTO/NCURSES-プログラミング-HOWTO/

于 2012-04-21T05:36:18.363 に答える