sgtpep/pmenuのようなアプリをCで作成したいと思っています。Cでstdinを正しく読み込むには?
次に、ncurses
のライブラリを見ていきます。私の最初の試みはメニューを選択することができます。私がls | ./a.out
のように、それはすべてのファイルを表示することができるはずですUPまたはDOWNを押すと、異なる項目が強調表示されます。
フルコードはhereです。
プログラムはキーを押さない。ループ内のmvprintw(n+1, 0, "%d\n", ch);
は常に-1
を出力します。
次に、無関係なコードを削除し、最小限の例を得ます。
#include <stdio.h>
char buf[100];
int main(int argc, char **argv) {
int ch;
while (fgets(buf, sizeof(buf), stdin)) puts(buf);
ch = getch();
printf("%d\n", ch);
ch = getch();
printf("%d\n", ch);
ch = getch();
printf("%d\n", ch);
ch = getch();
printf("%d\n", ch);
return 0;
}
ch
常に-1
です。私はstdin
がきれいでないと思われるので、fgets
の後にfflush(stdin)
を使用しますが、同じ結果になります。
stdin
から読み込む正しい方法は何ですか?
UPD1
#include <stdio.h>
char buf[100];
int main(int argc, char **argv) {
int ch;
while (fgets(buf, sizeof(buf), stdin)) puts(buf);
fflush(stdin);
ch = getchar();
printf("%d\n", ch);
ch = getchar();
printf("%d\n", ch);
ch = getchar();
printf("%d\n", ch);
ch = getchar();
printf("%d\n", ch);
return 0;
}
私はプログラムを変更しているので、それはもうncurses
に関連していないが、ls | ./a.out
を実行するとき、ch
は-1
を示し続けています。
UPD2
使用newterm
in
とout
作品をリダイレクトします。
FILE *fd = fopen("/dev/tty", "r+");
set_term(newterm(NULL, fd, fd)); // instead of initscr()
noecho();
cbreak();
keypad(stdscr, TRUE);
print_menu(cur, n);
while (true) {
ch = getch();
if (ch == KEY_UP || ch == 'k') --cur;
else if (ch == KEY_DOWN || ch == 'j') ++cur;
cur = (cur + n) % n;
print_menu(cur, n);
}
endwin();
私はこれがncursesの質問ではないかと疑いますが、実際にはCの質問ではありません。 POSIXシステムでCで読むための最低レベルのAPIは、実際には 'fgets'メソッドではなく、POSIXの' read'システムコールです。私はそれが問題のどこにあるとは思わない。問題は、端末が「rawモード」ではないということです。私は端末をrawモードに設定する方法を覚えていません。端末によって異なると思います.ncursesには、そのようなことを処理する初期化関数があります。 –
print_menu()に "refresh()"が表示されません。 ncursesアプリケーションの作成の詳細については、こちらをご覧ください:http://invisible-island.net/ncurses/ncurses-intro.html – TonyB
@TonyBありがとう!これはコピー&ペーストのエラーです...コード構造を変更して明確にしましたが、 'refresh()'の追加は忘れてしまいました。 – delta