C言語で入力を読むときgetc関数やscanf関数を
使用することが多いのですが
これらの関数を使用すると入力が完了するまで
そこでプログラムの実行がストップしてしまい
リアルタイムで処理できません
そこでioctlを使用して
ioctl(0, I_NREAD, &n)
というコードを書き、入力があったかどうかを調べようと思いました
ところがこの方法だとenterが入力されない限り
キー入力があったと認識されないので
たとえば"a"、"b"、"c"、"d"と入力してもすぐには読み込めず
この入力のあとにenterを入力して
はじめて文字が読めます
enterが入力されなくても、入力された文字を調べるには
どうしらたよいのでしょうか?
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
こんばんは。
OSもアーティテクチャもコンパイラも、わからないので、貴方の環境で動くかはわかりませんが、簡単なサンプルプログラムを作ってみました。
# 当方は Vine Linux 2.6r1(i386)で、gcc Version 2.95.3 です。
一応、コンパイルは通りますし、実行もちゃんとできるようですが、
ちゃんと見てないので、不適切な部分等があるかもしれません。
---------------------------------------------------------
/* リアルタイムにキー入力をチェックする方法(サンプル) */
#include <stdio.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>
int
main(void)
{
char in_char = 0; /* 入力されたキーを保持 */
char read_byte = 0; /* 読み込んだバイト数 */
struct termio tty_backup; /* 変更前の設定を保持 */
struct termio tty_change; /* 変更後の設定を保持 */
/* 最初に現在の設定を退避します */
ioctl(0, TCGETA, &tty_backup);
tty_change = tty_backup;
/* 設定を変更し、反映させます */
tty_change.c_lflag &= ~(ECHO | ICANON); /* エコーを止め、RAW モードへ変更 */
tty_change.c_cc[VMIN] = 0; /* 0文字入力された時点で入力を受け取る */
tty_change.c_cc[VTIME] = 1; /* 何も入力がない場合、1/10秒待つ */
ioctl(0, TCSETAF, &tty_change); /* ここで設定を反映 */
/* 無限ループにしてみる */
for(;;) {
/* read(システムコール)を使って標準入力から1文字取得 */
if ((read_byte = read(0, &in_char, 1)) == '\x0a') {
/* もし Enter キーが入力されたなら、ループから抜ける */
break;
}
/* システムコールが失敗したら、異常終了する */
else if (read_byte == -1) {
/* 退避していた設定に戻す */
ioctl(0, TCSETAF, &tty_backup);
/* 異常終了 */
return 1;
}
/* 入力された文字を出力する */
else if (in_char != 0x00) {
/* 入力された文字を出力する */
printf("今、 %c(%x) が入力されました\n",in_char ,in_char);
}
else {
printf("No Input\n");
}
in_char = 0x00;
}
/* 退避していた設定に戻す */
ioctl(0, TCSETAF, &tty_backup);
/* 正常終了 */
return 0;
}
回答ありがとうございます
プログラムを調べてみようと思います。
enterおさないと入力が受け取れないのは
Xウィンドウのせいかもしれないと知り合いから聞きました
もし、そうならiocltだけではうまくプログラムできないそうで
今度はそっちのほうも調べてみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(IT・Webサービス) Google日本語入力の操作方法 一度確定した後の訂正方法 1 2023/06/17 16:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- Windows 10 MicrosoftIMEでトラブル、助けてください m(_._)m 4 2023/05/16 14:11
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- Excel(エクセル) Excelで行削除をすると… 1 2023/07/26 11:57
- AJAX 入力フォームの値をQRコードで入力できるようにしたい。 6 2023/03/29 08:34
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- マウス・キーボード テンキーの設定がおかしくなっています。 5 2023/08/09 15:35
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
プログラミングの問題です 「金...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
*をユーザーが入力した数字の数...
-
C言語でgetchar();が上手く使え...
-
C言語について
-
OpenCV webカメラ同時出力について
-
C言語
-
fflush(stdin)の使い方とprintf...
-
java初心者です。入力されたの...
-
scanfが2回使えない・・・?;
-
getcharをしながらwhile文で出...
-
C言語 入力した値から0までの数...
-
至急教えてください。プログラ...
-
getchar()について 教えてくだ...
-
"scanf"でエンターで改行させな...
-
プログラミングの問題で、キー...
-
C言語 逆ピラミッドの作り方
-
入力エラーの処理について。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語 逆ピラミッドの作り方
-
double型が正常に認識されてい...
-
ワードで文字を入力する時の変...
-
コマンドプロンプトからのEOFの...
-
Linuxで入力待ちなしkeyread関...
-
scanf が無視されます
-
if文の条件にscanf関数を使うと…?
-
C言語について
-
cout関数を使っているのですが...
-
enterでループ終了
-
"scanf"でエンターで改行させな...
-
C言語でgetchar();が上手く使え...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報