Probléme de flux d'entrée standard STDIN c++
Résolu
virginie
-
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.
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:
- Probléme de flux d'entrée standard STDIN c++
- Pilote son standard - Télécharger - Pilotes & Matériel
- Apps nomades paris standard ✓ - Forum Réseaux sociaux
- Capture flux - Télécharger - TV & Vidéo
- Tableau à triple entrée - Forum Excel
- Deep freeze standard - Télécharger - Sécurité
12 réponses
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 :
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
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
Marrant ces gens qui demandent de l'aide mais restent persuader qu'ils ont raisons.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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
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
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
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
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
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
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.
Cela devrait correspondre à tes besoins.
Si t'as d'autres questions, n'hésite pas.
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.
encore merci et bonne continuation.