[c++]コンソール入力バッファの破棄

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
purin52002
記事: 235
登録日時: 1年前
連絡を取る:

[c++]コンソール入力バッファの破棄

#1

投稿記事 by purin52002 » 11ヶ月前

こんにちは

最近Win32_APIをつかってコンソールゲームを作っています。(文字のみで画面が構成される)

今回はダブルバッファを用いようと思ったため標準入出力は使わず、
代わりに
  • コンソール出力バッファ1
  • コンソール出力バッファ2
  • コンソール入力バッファ
を作ろうと思いました。

ダブルバッファを使った文字出力、入力バッファに文字入力はできたのですが、
入力バッファに残ったごみを削除することができません。
(15文字入力、ReadConsole関数で10文字読み込む、次のReadConsole関数に5文字読み込まれてしまう)

調べてみたところ、
残っているごみの数を調べるにはGetNumberOfConsoleInputEvents、
ごみを消すにはFlushConsoleInputBuffer
という関数を使うらしいのですが、これらがうまく動いてくれません。

入力バッファを引数に渡しても「ゴミは残ってない」、「だから消さない」と言ってくるのです。


今回の質問なのですがGetNumberOfConsoleInputEvents、FlushConsoleInputBufferに渡すのは入力バッファのハンドルであっているでしょうか?

というかそもそも違う関数を使うのでしょうか?

よろしくお願いします<(__)>


以下簡略コード

コード: 全て選択

auto input_handle =CreateFile
		(
			TEXT("CONIN$"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
			NULL, OPEN_EXISTING, 0, NULL
		);

char str[10];
DWORD temp;

//15文字入力すると先頭10文字がstrに格納される
ReadConsole(input_handle, str, 10, &temp, NULL);

//残っているごみの数をtempに格納->0が入る        
GetNumberOfConsoleInputEvents(input_handle, &temp);

//残り5文字をバッファから消したい
FlushConsoleInputBuffer(input_handle);

//でも消えずに残り5文字がstrに格納されてしまう
ReadConsole(input_handle, str, 10, &temp, NULL);   
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

sleep

Re: [c++]コンソール入力バッファの破棄

#2

投稿記事 by sleep » 11ヶ月前

purin52002 さんが書きました: 今回の質問なのですがGetNumberOfConsoleInputEvents、FlushConsoleInputBufferに渡すのは入力バッファのハンドルであっているでしょうか?
あっています。
purin52002 さんが書きました: 入力バッファに残ったごみを削除することができません。
(15文字入力、ReadConsole関数で10文字読み込む、次のReadConsole関数に5文字読み込まれてしまう)

調べてみたところ、
残っているごみの数を調べるにはGetNumberOfConsoleInputEvents、
ごみを消すにはFlushConsoleInputBuffer
という関数を使うらしいのですが、これらがうまく動いてくれません。

入力バッファを引数に渡しても「ゴミは残ってない」、「だから消さない」と言ってくるのです。

・・・(省略)

というかそもそも違う関数を使うのでしょうか?
理解して ReadConsole 関数を使用していますか?
ReadConsole、GetNumberOfConsoleInputEvents、FlushConsoleInputBuffer の3つの関数は正しく動いています。
msdn の説明をよく読みましょう。

アバター
purin52002
記事: 235
登録日時: 1年前
連絡を取る:

Re: [c++]コンソール入力バッファの破棄

#3

投稿記事 by purin52002 » 11ヶ月前

調べてみたところReadConsoleのごみはFlushConsoleInputBufferで削除できないみたいですね。
低レベル版のReadConsoleInputを使ったところ(おそらく)うまく動きました。

sleepさんありがとうございました<(__)>
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

返信

“C言語何でも質問掲示板” へ戻る