Probléme de flux d'entrée standard STDIN c++

Résolu
virginie -  
 virginie -
Bonjour,
voila je programme en c++ et je voudrais gérer mon clavier voila ce que sa donne:

char Touche[2];
if (fgetchar()==!EOF)
{
Touche[0]=fgetchar();
}

le probléme est que je recoit rien avec fgetchar il me revoit toujour la valeur EOF, je suppose donc que j'ai un probléme avec le flux d'entrée de mon clavier mais je ne sais pas trop comment le gérer :-(
si vous savez pourquoi ou si vous avez des idées pour faire autrement merci d'avance.
A voir également:

12 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,

EOF est la constante que retourne fgetchar si il n'y a pas de reception de caractére
Pas du tout.
fgetchar (d'ailleurs, tu devrais plutôt utiliser getchar que fgetchar) renvoie EOF en cas d'erreur ou lorsque la fin du fichier est atteint. Tant qu'il n'y a pas de réception de caractères et aucune erreur, la fonction attend.

char Touche[2];
if (fgetchar()==!EOF)
{
Touche[0]=fgetchar();
}

Attention tu appelles deux fois la fonction fgetchar. Lorsque tu appelles fgetchar la deuxième fois, il ne prendra pas la même valeur nécessairement. Cela dépend de ce qu'il y a dans le buffer clavier.
De plus, en console l'EOF est généré lorsque tu appuies sur Ctrl + Z + entrée (sous windows). (Il en va autrement pour un fichier).

La valeur de EOF vaut -1 en général. Et !EOF vaut 0. Donc il y a un souci avec ton code.

Tu devrais plutôt mettre :
char Touche[2]=""; /*important d'initialiser Touche[0] à '\0' pour éviter un bug lorsqu'un EOF sera généré*/
int c;
if ( (getchar()=c)!=EOF) {
    Touche[0]= c;
     Touche[1]='\0';
}


Par ailleurs, je te conseille fortement de ne pas oublier de vider le buffer clavier pour éviter bien de mauvaises surprises en cas de relecture sur stdin.

Cdlt
2
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
c'est quoi fgetchar, je ne trouve pas la page de man ?
fgetchar()==!EOF
si tu rentres dans la boucle, ça ne veux pas dire que fgetchar te renvoi toujours EOF, mais qu'il ne renvoi jamais 0.
EOF, je ne sais aps ce que ça vaut, mais surement autre chose que 0.
Donc "!EOF" vaut 0 (!a vaut 1 si a vaut 0 et 1 sinon), c'est à dire que tu rentre dans ton if, dès que fgetchar retourne autre chose que 0.
0
virginie
 
EOF est la constante que retourne fgetchar si il n'y a pas de reception de caractére donc je rentre dans mon if uniquement si je recoi un caractére et je le mémorise dans Touche[0] le probléme et que je ne rentre jamais dans mon if.
j'ai cru voir qu'il fallais appuyé sur "entrée" pour que cette fonction puisse retourné le caractére reçu, méme en appuyant sur "entrée" je ne reçoit rien.
mais moi je ne désire pas devoir appuyé sur entrée pour validé le caractére il me faut donc une autre fonction que je ne connait pas car je pense qu'il doit éxisté une fonction qui permet de lire les caractére envoyé par le clavier sans validé par entrée.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299 > virginie
 
EOF est la constante que retourne fgetchar si il n'y a pas de reception de caractére
possible (mais j'en doute, si il n'y a pas de réception, à mon avis il bloque le programme)
donc je rentre dans mon if uniquement si je recoi un caractére
faux !
tu rentre dans ton if dès que fgetchar() retourne 1 si EOF vaut 0 et 0 si EOF est différent de 0.
l'opérateur "!" est un opérateur booleen, au mieux il agit sur les bits.
"a==!b" n'a rien à voir avec "a!=b" !
Ce que tu cherche à faire, je ne sais pas en standard.
0
virginie
 
possible (mais j'en doute)
moi je n'en doute pas j'en suis sur cf aide builder.
donc je rentre dans mon if uniquement si je recoi un caractére
faux !
tu rentre dans ton if dès que fgetchar() retourne 1

faux fgetchar ne retourne pas 1 mais retourne la valeur du caractére émis cf aide builder
je pense que je n'y ariverais pas avec cette fonction mais une autre qui me permettra la réception du caractére sans avoir a appyué sur entrée aprés mais je ne connais pas une telle fonction.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Merci fiddy, maintenant que nous sommes deux à lui dire peut être nous croira elle ?
Marrant ces gens qui demandent de l'aide mais restent persuader qu'ils ont raisons.
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Ben, merci, je me suis bien amusé en lisant les messages ;-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
virginie
 
merci fiddy pour les précissions mais avec getchar ne suis je pas obliger d'appuyé sur entrée?
et dois je ouvrir une fénétre type dos pour réaliser la saisie clavier car je souhaiterais que ceci reste transparent comme par exemple lorsque l'on joue a un jeu et que l'on appui sur 'p' pour le mettre en pause.
je n'oubli pas de vider mon buffer avec fflush merci du conseil
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
mais avec getchar ne suis je pas obliger d'appuyé sur entrée?
Si. C'est d'ailleurs pour cela qu'il faut vider le buffer clavier. Si tu ne souhaites pas valider par la touche entrée, dans ce cas utilise plutôt getch ou getche suivant le cas où tu souhaites garder l'écho.

et dois je ouvrir une fénétre type dos pour réaliser la saisie clavier
Elle s'ouvrira tout seul la fenêtre lors de l'appel de la fonction.
Si tu ne souhaites pas utiliser de console, tu devras utiliser une GUI (Qt, GTK, API Windows, ...).

et que l'on appui sur 'p' pour le mettre en pause.
Si t'es en console, tu devras utiliser kbhit() qui permettra de continuer le programme. Idéal sur windows lorsque tu attends un événement en console.

je n'oubli pas de vider mon buffer avec fflush
Aïe. Il ne faut pas utiliser fflush sur stdin car cela indéfini. Tu dois te créer la fonction toi-même (à base de getchar).

Cdlt
0
virginie
 
toutes une éducation de programmation a refaire ;)
je veut bien que tu m'explique clairement les chose car je suis complétement perdu.
que doit je mettre dans mon code et pourquoi.
merci d'avance
0
virginie
 
dsl pour le double post mais j'ai oublié de dire plein de chose dans le précend.
je vais tenter d'expliquer mon cas plus clairement.
je programme en builder c++ j'ai donc une face avant ou j'ai des memo des groupradio etc.....
toutes les 50ms j'ai une interruption qui me permet de mettre a jours des images qui gere des entrées et sorties.
je penser donc venir scruté toutes les 50ms le flux de mon clavier pour savoir si une touche a été activée.
dans le cas ou une touche aurrais été activé je voudrais par exemple modifier l'état de mes sortie en fonction du caractére reçu.
tout sa en aillant uniquement ma face avant a l'écran.
j'espére avoir été clair dans mes explication
merci fiddy
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Dans ce cas, je te conseille plutôt de te tourner vers : https://cpp.developpez.com/faq/bcb/#testeretattouche

Cela devrait correspondre à tes besoins.

Si t'as d'autres questions, n'hésite pas.
0
virginie
 
je te remerci beaucoup fiddy grace au explication est au code qui y était j'ai réussi a faire se que je souhaitée.
encore merci et bonne continuation.
0
virginie
 
merci fiddy car éffectivement dans cette page tout était expliquer bizarre que je ne l'es pas trouver lors de mes recherches.
encore merci et bonne continuation.
probléme résolu
0
virginie
 
merci fiddy tout était écrit sur cette page bizarre que je ne l'es pas trouver lors de mes recherches .
bonne continuation et encore merci
probléme résolu
0