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
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.

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
0
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.
0
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
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 :
#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,
0
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 -_-
0
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
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.
0
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!
0

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
.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
0