2 votes

Comment effacer le tampon d'entrée de la console C/C++ winapi

Je suis essentiellement en train de créer ma propre console d'E/S, (donc pas de cout, cin, etc) mais parfois quand je lis l'entrée, je ne lis pas tous les caractères du tampon, car je peux sélectionner combien je veux lire, mais la prochaine fois que j'appelle ReadConsoleA/W() il n'attend pas l'entrée de l'utilisateur car il lit ce qui reste dans le tampon. J'ai essayé FlushConsoleInputBuffer() mais ça n'a pas fonctionné, voici essentiellement ce que j'ai :

#inlcude 

// Ces variables globales sont juste à titre d'exemple
DWORD octets;
HANDLE in;
HANDLE out;

void WrtConsole(const char* texte, DWORD taille)
{
    WriteConsoleW(out, texte, taille, &octets, 0);
}

void ReaConsole(char* texte, DWORD taille_max)
{
    FlushConsoleInputBuffer(in);

    ReadConsoleA(in, texte, taille_max, &octets, 0);
}

// J'utilise `int WINAPI mainCRTStartup()`, mais cela n'a pas d'importance, je n'utilise pas de choses iostream.
int main()
{
    out = GetStdHandle(STD_OUTPUT_HANDLE);
    in = GetStdHandle(STD_INPUT_HANDLE);

    char num1[4];
    char num2[4];

    WrtConsole(L"Premier nombre : ");
    ReaConsole(num1, 4);
    WrtConsole(L"Deuxième nombre : ");
    ReaConsole(num2, 4);

    // ...
}

Maintenant, par exemple, si l'utilisateur tape un nombre à 3 chiffres, comme 100, la fonction ReadConsole() va lire '1','0','0','\r' mais va laisser le '\n' dans le tampon d'entrée, causant ainsi l'effet de saut à l'appel suivant à ReadConsole().
Comme je l'ai dit, FlushConsoleInputBuffer() n'a pas fonctionné, donc, comment puis-je vider le tampon d'entrée de la console afin que l'appel suivant à ReadConsole() ne soit pas "sauté"?

-1voto

TongXu Points 33

Je comprends!

Le problème est ReadConsole. ReadConsole lit l'entrée de caractères à partir du tampon d'entrée de la console et le supprime du tampon.

Cependant, max_size que vous définissez ne signifie pas TAILLE MAX! En fait, vous le définissez à 4: ReaConsole(num1, 4). ReadConsole ne lit pas toutes les entrées de caractères.

Quand je le mets à 16, cela fonctionne normalement. entrer la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X