合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: purin52002
[URL]
プログラマー(26,446 ポイント)
Date: 2017年5月13日(土) 10:41
No: 1
(OFFLINE)

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

こんにちは

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

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

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

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

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


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

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

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


以下簡略コード
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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^

Name: sleep
[URL]
Date: 2017年5月18日(木) 17:24
No: 2
(OFFLINE)

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

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

あっています。

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

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

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

・・・(省略)

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

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

Name: purin52002
[URL]
プログラマー(26,446 ポイント)
Date: 2017年5月18日(木) 23:24
No: 3
(OFFLINE)

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

[解決!]

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

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[15人]