Probléme de flux d'entrée standard STDIN c++
Résolu/Fermé
A voir également:
- Probléme de flux d'entrée standard STDIN c++
- Netflix standard avec pub - Guide
- Le point d'entrée de procédure est introuvable dans la bibliothèque de liens dynamiques ✓ - Forum Logiciels
- Capture flux - Télécharger - TV & Vidéo
- Processeurs de flux - Forum Matériel & Système
- Rgss-rtp standard ✓ - Forum Jeux vidéo
12 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 833
27 juil. 2009 à 22:57
27 juil. 2009 à 22:57
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
Char Snipeur
Messages postés
9696
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
27 juil. 2009 à 15:30
27 juil. 2009 à 15:30
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.
Char Snipeur
Messages postés
9696
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
>
virginie
27 juil. 2009 à 16:26
27 juil. 2009 à 16:26
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.
Char Snipeur
Messages postés
9696
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
28 juil. 2009 à 08:06
28 juil. 2009 à 08:06
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.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
28 juil. 2009 à 08:13
28 juil. 2009 à 08:13
Salut,
Ben, merci, je me suis bien amusé en lisant les messages ;-))
Ben, merci, je me suis bien amusé en lisant les messages ;-))
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
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 833
28 juil. 2009 à 21:48
28 juil. 2009 à 21:48
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
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 833
29 juil. 2009 à 21:39
29 juil. 2009 à 21:39
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.
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
encore merci et bonne continuation.
probléme résolu