Comment savoir si stdin est vide??
Fermé
superflo182
-
17 avril 2014 à 12:00
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 18 avril 2014 à 09:48
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 18 avril 2014 à 09:48
A voir également:
- Comment savoir si stdin est vide??
- Comment supprimer une page vide sur word - Guide
- Formate pour taxer client frigo vide - Forum PDF
- Coeur vide - Forum Facebook
- Code pour écrire un coeur VIDE : alt+??? ✓ - Forum Mail
- Formule excel si cellule non vide alors couleur ✓ - Forum Excel
5 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 avril 2014 à 14:45
17 avril 2014 à 14:45
Rien de standard.
Sur windows, tu peux utiliser _kbhit() : https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/kbhit?redirectedfrom=MSDN&view=msvc-160&viewFallbackFrom=vs-2019
Cdlt,
Sur windows, tu peux utiliser _kbhit() : https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/kbhit?redirectedfrom=MSDN&view=msvc-160&viewFallbackFrom=vs-2019
Cdlt,
J'utilise linux...
mais comme j'ai pas trouvé comment verifier stdin je pensais simuler l'appuye sur la touche <enter> du clavier pour pouvoir vider stdin (enfin y mettre quelque chose)
j'ai trouver la fonction write mais je sais pas si j'ecris vraiment sur stdin et je sais pas comment simuler la touche enter
merci.
mais comme j'ai pas trouvé comment verifier stdin je pensais simuler l'appuye sur la touche <enter> du clavier pour pouvoir vider stdin (enfin y mettre quelque chose)
j'ai trouver la fonction write mais je sais pas si j'ecris vraiment sur stdin et je sais pas comment simuler la touche enter
merci.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 avril 2014 à 16:34
17 avril 2014 à 16:34
Sur Linux, tu peux utiliser la fonction select() pour tester un changement d'état : http://www.linux-france.org/article/man-fr/man2/select-2.html
Exemple :
Cette fonction devrait te renvoyer 1 s'il y a une valeur dans stdin.
Cdlt,
Exemple :
#include <unistd.h> #include <sys/time.h> int valeur_dans_stdin(void) { fd_set fds; struct timeval temps = { 0, 0 }; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); return select(1+STDIN_FILENO, &readfds, NULL, NULL, &temps) == 1; }
Cette fonction devrait te renvoyer 1 s'il y a une valeur dans stdin.
Cdlt,
Merci beaucoup je venez de la trouver sur un autre site, cette fonction remplace kbhit de windows.lol
cette fonction me permet de savoir si quelque chose a etait "ecrit+enter" sur le clavier, je passe en mode raw pour permettre de voir les caractere meme sans la touche entre.
mais il me reste un probleme de taille,c'est que pour vider le buffer je dois trouver '\n' avec getchar Or si je tape des lettres sans appuye sur entré mon programme reste bloqué en attendant ce fameux enter que je ne peut pas simuler -_-
cette fonction me permet de savoir si quelque chose a etait "ecrit+enter" sur le clavier, je passe en mode raw pour permettre de voir les caractere meme sans la touche entre.
mais il me reste un probleme de taille,c'est que pour vider le buffer je dois trouver '\n' avec getchar Or si je tape des lettres sans appuye sur entré mon programme reste bloqué en attendant ce fameux enter que je ne peut pas simuler -_-
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 avril 2014 à 17:20
17 avril 2014 à 17:20
Pour éviter que ton programme reste bloquer, tu peux utiliser la fonction que je t'ai faite (elle te dit si stdin contient des données)...
Dis plutôt ce que tu souhaites faire, car je ne suis pas sûr que tu es pris la bonne direction avec le passage en mode raw et compagnie. D'ailleurs pour info, la touche entrée renvoie '\r' et non '\n'. Donc si tu es en mode raw, ne t'attend pas à vérifier '\n' dans stdin.
Dis plutôt ce que tu souhaites faire, car je ne suis pas sûr que tu es pris la bonne direction avec le passage en mode raw et compagnie. D'ailleurs pour info, la touche entrée renvoie '\r' et non '\n'. Donc si tu es en mode raw, ne t'attend pas à vérifier '\n' dans stdin.
J'atttend qu'un message arrive, et ensuite une fois le message reçu he demande si on veut vider le buffer a l'aide d'un scanf le seul probleme aue je rencontre c'est au moment de l'attente du message...si l'utilisateur ecrit dans le terminal a ce moment la sans appuyé sur la touche entré je ne sort pas de ma boucle pour vider le buffer stdin etant donné que la condition de sortie pour vider stdin c'est '\n' ou EOF donc j'aimerais soit simuler un \n lorsque celui n'est pas present.
En realiter ce que je veux faire est simple, seulement si c'etait un simple buffer ou tableaux il suffirait de verifier sa taille regarder le dernier caractere si c'est '\n' on vide sinon on en place un une case apres et on vide sauf que non... c'est stdin et c'est pas possible!
En realiter ce que je veux faire est simple, seulement si c'etait un simple buffer ou tableaux il suffirait de verifier sa taille regarder le dernier caractere si c'est '\n' on vide sinon on en place un une case apres et on vide sauf que non... c'est stdin et c'est pas possible!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 avril 2014 à 09:48
18 avril 2014 à 09:48
.si l'utilisateur ecrit dans le terminal a ce moment la sans appuyé sur la touche entré je ne sort pas de ma boucle pour vider le buffer stdin
C'est pour ça que tu peux utiliser la fonction valeur_dans_stdin(). Cela évitera que tu tombes dans ce cas.
Pour simuler l'appuie (bien que je ne pense pas que tu en aies besoin), tu peux essayer write(0, "\n", 1);
Cdlt,
-
Google is your friend
C'est pour ça que tu peux utiliser la fonction valeur_dans_stdin(). Cela évitera que tu tombes dans ce cas.
Pour simuler l'appuie (bien que je ne pense pas que tu en aies besoin), tu peux essayer write(0, "\n", 1);
Cdlt,
-
Google is your friend