キーボード入力を読み込むためにselect()を使用しようとしていますが、キーボードから読み込み、ファイル記述子を使用する方法がわかりませんそう。私はこの問題に近づくためにSTDINとSTDIN_FILENOを使うように言われましたが、私はまだ混乱しています。
どうすればいいですか?select()を使用してCキーボードの入力を読み取る方法
答えて
少し混乱しています。 select()
は、入力が利用可能になるまでブロックするために使用されます。しかし、通常のファイル読み取り機能(例えばread
、fread
、fgetc
など)で実際の読み取りを行います。
ここに簡単な例があります。 stdinに少なくとも1つの文字が読み込み可能になるまでブロックされます。もちろん、ターミナルをいくつかの未調子のモードに変更しない限り、入力した文字がファイルバッファにフラッシュされる(ある端末バッファから)ときに、Enterキーを押すまでブロックされます。
#include <stdio.h>
#include <sys/select.h>
int main(void) {
fd_set s_rd, s_wr, s_ex;
FD_ZERO(&s_rd);
FD_ZERO(&s_wr);
FD_ZERO(&s_ex);
FD_SET(fileno(stdin), &s_rd);
select(fileno(stdin)+1, &s_rd, &s_wr, &s_ex, NULL);
return 0;
}
ありがとう、これは本当に私の質問を明らかにした。 – drum
"WINDOWS"のキーボード入力を覗いてみたいですか? ウィンドウでは、STDINのselect()の結果を取得できません。 PeekConsoleInput()を使用する必要があります。 stdinのハンドルは次のように使用してください。
hStdin = CreateFile("CONIN$", GENERIC_READ|GENERIC_WRITE, ...
stdinがパイプ入力になることがあります。そうであれば、キーボード入力はありません。
P.S.あなたがWindowsについて尋ねなければ、すみません。
Windowsは私にさえ起きなかった。素敵なセーブ:すべての角度をカバーする。 –
すでに述べたように、selectを使用すると、たとえば入力データが既に読み込み可能かどうかを確認します。利用可能な場合は、たとえば以下に示すようfgetsが安全に、いくつかのバッファへの入力データを読むために:あなたは一般的なPOSIXプログラミングに慣れていない場合
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
fd_set rfds;
struct timeval tv;
int retval, len;
char buff[255] = {0};
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;
retval = select(1, &rfds, NULL, NULL, &tv);
if (retval == -1){
perror("select()");
exit(EXIT_FAILURE);
}
else if (retval){
/* FD_ISSET(0, &rfds) is true so input is available now. */
/* Read data from stdin using fgets. */
fgets(buff, sizeof(buff), stdin);
/* Remove trailing newline character from the input buffer if needed. */
len = strlen(buff) - 1;
if (buff[len] == '\n')
buff[len] = '\0';
printf("'%s' was read from stdin.\n", buff);
}
else
printf("No data within five seconds.\n");
exit(EXIT_SUCCESS);
}
- 1. キーボードの入力を単語ごとに読み取る方法
- 2. Pythonでバックグラウンドスレッドからキーボード入力を読み取る方法は?
- 3. Scannerクラスを使用してギリシャ語の入力をキーボードから読み取る方法は?
- 4. メディアキーを使用してUSBキーボードのキーコードを読み取る方法
- 5. javascriptを使用して入力配列からデータを読み取る方法
- 6. 入力タイプ範囲を使用してプロパティターゲットを読み取る方法
- 7. C#コンソールアプリケーションがPhPからの入力を読み取る方法
- 8. ユーザーから複数のキーボード入力を同時に読み取る方法は?
- 9. ユーザーのキーボード入力を読み取る方法は?現時点で
- 10. 入力に応じてオブジェクトを読み込む方法$ select
- 11. C#を使用してLSBビットを読み取る方法
- 12. C#を使用してAzure Webジョブログファイルを読み取る方法
- 13. Rの入力ユーザーとしてベクトルを読み取る方法
- 14. キーボードから直接Javaの入力を読み取る
- 15. Cを使用してマイクから読み取る方法
- 16. C/C++での通常のファイル読み取り機能を使用してメディアファイルを読み取る方法は?
- 17. キーボードのC#での入力でテキストプロパティの "&"を使用して
- 18. パイプ入力とキーボード入力用に異なるハンドルを使用する方法
- 19. C#のブロックのみキーボード入力
- 20. 入力の読み込みをBufferedReaderのreadline()を使用して
- 21. Rails:text_field_tag入力でユーザーが入力した値を読み取る方法は?
- 22. C#を使用してこの種のXMLファイルを読み取る方法は?
- 23. Clojureでバッファリングされていないキーボード入力を読み取る
- 24. Javascriptを使用して入力を読み取り専用に設定する
- 25. JSを使用して入力を読み取り専用に設定する
- 26. C# - OpenXMLを使用してExcelファイルの空白を読み取る方法
- 27. C#を使用して特定のフォントでテキストデータを読み取る方法は?
- 28. fscanfを使用してC言語の倍精度を読み取る方法
- 29. C#を使用してword docのテーブルから値を読み取る方法
- 30. C#を使用してテキストファイルの行で文字を読み取る方法
をこれが行うにはかなりトリッキーなものです。一つは、デバイスが受信した文字をバッファしないように端末モードを設定する必要があります。 – antlersoft
もちろん、宿題の一部でない限り、select()を使う必要はありません。あなたはちょうどfread(STDIN ...)またはread(STDIN_FILENO ...)することができます。 –
完全なターミナルコントロール(キーの押下など)が必要な場合は、** ncurses **(Windowsポートもあります)などのターミナルライブラリを使用するほうがずっと良いでしょう。 –