Comment savoir si stdin est vide??
superflo182
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
voila j'ai realisé un programme TCP_serveur_client en C donc je me connecte j'attend un message je l'affiche et je demande (scanf) de rentrer 0 ou 1 pour savoir si l'utilisateur veut faire ou pas faire l'action enfin bref tout fonctionne je rencontre un soucis seulement avec mon scanf() car j'arrive a gerer toute les erreur qui sont possible (supprimé les "\n" apres et tout)
le probleme c'est au debut de mon programme au moment de l'attente du message si je rentre un chiffre ou un caractere peut importe, au moment ou je pose la question avec scanf je vide stdin mais le soucis c'est que si je rentre rien il attend aue je rentre quelque chose!! je voudrais savoir si c'est possible de verifier si stdin est vide alors on vide pas si y'a quelque chose dedans alors on vide??
merci d'avance Florian.
voila j'ai realisé un programme TCP_serveur_client en C donc je me connecte j'attend un message je l'affiche et je demande (scanf) de rentrer 0 ou 1 pour savoir si l'utilisateur veut faire ou pas faire l'action enfin bref tout fonctionne je rencontre un soucis seulement avec mon scanf() car j'arrive a gerer toute les erreur qui sont possible (supprimé les "\n" apres et tout)
le probleme c'est au debut de mon programme au moment de l'attente du message si je rentre un chiffre ou un caractere peut importe, au moment ou je pose la question avec scanf je vide stdin mais le soucis c'est que si je rentre rien il attend aue je rentre quelque chose!! je voudrais savoir si c'est possible de verifier si stdin est vide alors on vide pas si y'a quelque chose dedans alors on vide??
merci d'avance Florian.
A voir également:
- Comment savoir si stdin est vide??
- Comment supprimer une page vide sur word - Guide
- Caractere vide - Guide
- Formate pour taxer client frigo vide - Forum Vos droits sur internet
- Nb si ens non vide ✓ - Forum Excel
- Formaté mais pas de connexion Internet ? ✓ - Forum Matériel & Système
5 réponses
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.
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 -_-
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
.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