0

stdin次のようなコンソールアプリからハンドルを取得した場合:

HANDLE hStdIn = ::GetStdHandle(STD_INPUT_HANDLE);

次に、そこからデータを読み取ることができます。

BYTE buff[32];
DWORD dwcbRead = 0;
BOOL bReadRes = ::ReadFile(hStdIn, buff, SIZEOF(buff), &dwcbRead, NULL);

私の質問は、それらを読み取る前に、使用可能なバイト数をどのように知ることができるかということです。

PS。ReadFile読み取ることができるデータがない場合はブロックされているようです。

4

4 に答える 4

1

stdinでの入力の可用性の確認

于 2013-02-13T20:36:54.893 に答える
1

コンソール入力の場合、ユーザーまたはマシンがどのように文字を配信するかはわかりません。
たとえば、私のプログラムでは、文を入力するように求められます。あなたはどの文を考えていますか?どちらを入力しますか?文中の文字はいくつですか?

本当に知りたいのなら、心を読むコース、あるいは人間以外からのインプットの場合は、未来を予測するコースを強くお勧めします。

ファイルの場合は、サイズを確認できます。

于 2013-02-13T20:37:13.010 に答える
1

ReadConsoleInput生の入力イベントを読み取りPeekConsoleInput、入力キューから削除せずにそれらを調べるために使用します。ここにはたくさんの警告があります:

  1. 標準入力がリダイレクトされる可能性がある場合は、そのタイプを判別し、それに応じて動作する必要があります。ファイルの場合、ブロックされることはなく、先に進んで読んでください。パイプの場合PeekNamedPipeは、いくつかのヘルプを提供します。

  2. 入力イベントと文字の間に1対1の対応はありません。

  3. ENABLE_LINE_MODEコンソールでが設定されている場合、改行がまだ入力されていない場合はReadFile/がブロックされます。さらに、実際に電話ReadConsoleをかける前は回線編集機能を利用できず、電話をかけるとブロックされます。 ReadConsoleReadConsole

ReadFile別のスレッドでまたはReadConsole(または前者へのフォールバックで後者を試す)ことをお勧めします。メインスレッドは何か便利なことをして、最終的に読み取りスレッドの準備ができているかどうかをチェック(または待機)する場合があります。

于 2013-02-13T20:44:12.583 に答える
0

はい、あなたはそれを行うことができます、そしてはい、それはあなたの入力がバッファを満たすのを待ってそこに座ります。それが希望しない場合は、ReadFileを使用しないでください。

保留中の「イベント」の数を提供する機能など、コンソールI/Oを読み取るための機能は他にもあります。

コンソールIO機能

于 2013-02-13T20:40:48.277 に答える