IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

comment savoir s'il y a des données a lire dans un flux ?


Sujet :

Réseau C

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut comment savoir s'il y a des données a lire dans un flux ?
    C'est juste un petit exemple :
    stream est in FILE*...
    je cherche a lire ce qui'il y a dessus, et a l'afficher...
    or je bloque dans fgets(à la troisième itération)...
    j'ai aussi essayé du getc à la place du feof pour essayer de voir s'il y a quelque chose dans le flux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(!feof(stream))
    {
    	fgets(buffer,BUFFERSIZE,stream);
    	printf("%s\n",buffer);
    }
    mon problème est que je suppose que mon flux est vide sans etre fermé...

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: comment savoir s'il y a des données a lire dans un flux
    Citation Envoyé par Gandalf
    stream est in FILE*...
    je cherche a lire ce qui'il y a dessus, et a l'afficher...
    or je bloque dans fgets(à la troisième itération)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(!feof(stream))
    {
    	fgets(buffer,BUFFERSIZE,stream);
    	printf("%s\n",buffer);
    }
    J'ai expliqué maintes fois, mais visiblement le message a du mal à passer, que feof() ne faisait pas ce qu'on croit souvent (C != Pascal). Pour déterminer la fin de lecture, il faut tester la valeur retournée par la fonction de lecture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (fgets (buffer, BUFFERSIZE, stream) != NULL)
    {
       printf ("%s\n", buffer);
    }
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Ca c'était effectivement la premiere forme...

    Qui ne marche pas non plus...

    ca reste toujours bloqué sur le fgets...

  4. #4
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Citation Envoyé par Gandalf
    ca reste toujours bloqué sur le fgets...
    Je ne comprend pas cette phrase . Comme ça , ça reste "bloquer" ?
    Si il n'y a plus rien à lire, fgets retournera NULL et donc tu sors de la boucle. Je comprend pas :

    Nas'

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par Nasky
    Citation Envoyé par Gandalf
    ca reste toujours bloqué sur le fgets...
    Je ne comprend pas cette phrase . Comme ça , ça reste "bloquer" ?
    Si il n'y a plus rien à lire, fgets retournera NULL et donc tu sors de la boucle. Je comprend pas :

    Nas'
    la fonction ne retourne pas...
    tout simplement

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Gandalf
    ca reste toujours bloqué sur le fgets...
    Il y a un plantage quelque part.
    Je soupçonne que la taille réelle de buffer soit inférieure à BUFFERSIZE. Poste le code minimum qui montre le problème avec un exemple de fichier à lire.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Ca vient peut-être du printf alors... essaye comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(fgets(buffer,BUFFERSIZE,stream) != NULL )
    {
       printf("%s\n",buffer); 
       fflush(stdout);
    }
    C'est bizarre que tu restes bloquer dans la boucle...
    Est-ce que t'as des trucs qui s'affichent ou ca bloque completement, sans rien écrire ?

    Nas'

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Nasky
    Ca vient peut-être du printf alors... essaye comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(fgets(buffer,BUFFERSIZE,stream) != NULL )
    {
       printf("%s\n",buffer); 
       fflush(stdout);
    }
    Inutile. Il y a déjà un '\n'.
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    AH... oui c'est vrai.
    Mais si la taille de buffer est inférieure à celle indiqué dans BUFFERSIZE, pourquoi ça plante qu'au bout du troisième passage ? Pourquoi pas avant ?

    Nas'

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Ce code là reste bloqué également, mais un peu plus loin... c'est à dire que j'ai une ligne de plus... qui ne se termine pas par un \n

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(first = fgetc(stream))
    {
    	printf("%c",first);
    	fflush(stdout);
    }

  11. #11
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Citation Envoyé par Gandalf
    Ce code là reste bloqué également, mais un peu plus loin... c'est à dire que j'ai une ligne de plus... qui ne se termine pas par un \n

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(first = fgetc(stream))
    {
    	printf("%c",first);
    	fflush(stdout);
    }
    Je sais pas si ça résout le problème mais il manque la condition d'arrêt.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((first=fgetc(stream)) !=EOF)
    Si ce code bloque aussi, c'est quand même étrange.

    Tu l'ouvre comment ton fichier ? C'est peut-etre la gestion des retours à la ligne qui en est la cause ? Si tu l'ouvre en binaire par exemple...utilise fread.

    Nas'

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Gandalf
    ca reste toujours bloqué sur le fgets...
    Il y a un plantage quelque part.
    Je soupçonne que la taille réelle de buffer soit inférieure à BUFFERSIZE. Poste le code minimum qui montre le problème avec un exemple de fichier à lire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void dump(FILE* stream)
    {
    	char buffer[BUFFERSIZE];
    	int first;
    	while(first = fgetc(stream))
    	{
    		printf("%c",first);
    		fflush(stdout);
    	}
    }
    par contre stream ne provient pas d'un fichier, c'est la sortie d'un autre programme... j'essaye de faire un racourci...

    le probleme est bien de savoir s'il y a encore quelque chose à lire dans un stream...

    un peu comme si mon stream était un stdin et si voulais y prendre une valeur...

    Nasky > c'est bloqué en attente... aucun affichage et meme pas d'utilisation CPU...

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Gandalf
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Gandalf
    ca reste toujours bloqué sur le fgets...
    Il y a un plantage quelque part.
    Je soupçonne que la taille réelle de buffer soit inférieure à BUFFERSIZE. Poste le code minimum qui montre le problème avec un exemple de fichier à lire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void dump(FILE* stream)
    {
    	char buffer[BUFFERSIZE];
    	int first;
    	while(first = fgetc(stream))
    	{
    		printf("%c",first);
    		fflush(stdout);
    	}
    }
    Tu n'utilises pas 'buffer'. C'est probablement ps le bon code. Prend un peu de temps pour tester ton code par étapes.
    par contre stream ne provient pas d'un fichier, c'est la sortie d'un autre programme... j'essaye de faire un racourci...
    Ah, mais on ne peut pas faire ça en C standard. Tu utilises sans doute les pipes. Il faut voir avec les spécialistes de ton système. Il doit y avoir des conditions (comme une ligne doit être terminée par un '\n'), par exemple... sinon, il faut forcer coté émission si on peut (fflush())
    le probleme est bien de savoir s'il y a encore quelque chose à lire dans un stream...

    un peu comme si mon stream était un stdin et si voulais y prendre une valeur...
    Le problème, c'est que le comportement est spécifié avec stdin, il ne l'est pas (du moins par le standard) avec les pipes.
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par Emmanuel Delahaye

    Tu n'utilises pas 'buffer'. C'est probablement ps le bon code. Prend un peu de temps pour tester ton code par étapes.
    Tu mettais en doute la déclaration de buffer, là tu l'avais... un tableau non utilisé n'est pas une catastrophe...

    Citation Envoyé par Emmanuel Delahaye
    Ah, mais on ne peut pas faire ça en C standard. Tu utilises sans doute les pipes. Il faut voir avec les spécialistes de ton système. Il doit y avoir des conditions (comme une ligne doit être terminée par un '\n'), par exemple... sinon, il faut forcer coté émission si on peut (fflush())

    Le problème, c'est que le comportement est spécifié avec stdin, il ne l'est pas (du moins par le standard) avec les pipes.
    popen : standard POSIX.2

    De plus si mon pipe est au niveau du shell le problème redevient du C ANSI

    > prog1 | prog2

    je suis dans prog2 et je cherche à lire la sortie de prog1 sans rester bloqué... quand il cesse d'envoyer des informations...

  15. #15
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
     
    #define BUFFERSIZE 1024
     
    void dump(FILE* stream)
    {	
       char buffer[BUFFERSIZE];
       while(fgets(buffer,BUFFERSIZE,stream))
       {
          printf("%s",buffer);
       }
    }
     
    int main(int argc, char* argv[])
    {
       dump(stdin);
       return 0;
    }
    voici donc un prog complet...

    le lancer de la maniere suivante :
    rsh machine | prog2
    avec un .rhost dans vorte compte sur la machine cible pour eviter d'avoir a entrer un mot de passe.

    le programme s'arrete avant le prompt

    tapez: echo hello world
    a l'aveugle bien sur !
    puis le prompt apparait avec votre phrase.
    puis s'affiche hello word
    et ainsi de suite ...

    le comportement que je souhaite :
    Le prog affiche le début de l'entete de rsh (voire rien enventuellment) puis se termine...

  16. #16
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Euh ?
    meme en le lancant sans le rsh on vois le Pb...

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Gandalf
    <...>
    Je ne vois aucun problème avec ce programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define BUFFERSIZE 1024
     
    void dump (FILE * stream)
    {
       char buffer[BUFFERSIZE];
       while (fgets (buffer, BUFFERSIZE, stream))
       {
          printf ("%s", buffer);
       }
    }
     
    int main ()
    {
       dump (stdin);
       return 0;
    }
    Une fois avec un \n' à la fin, une fois sans. C'est peut être ton système ou ton shell qui est buggué?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    D:\DEVELOPP\G\GANDALF\EXE>type main.c |proj.exe
    #include <stdio.h>
    #include <stdlib.h>
     
    #define BUFFERSIZE 1024
     
    void dump (FILE * stream)
    {
       char buffer[BUFFERSIZE];
       while (fgets (buffer, BUFFERSIZE, stream))
       {
          printf ("%s", buffer);
       }
    }
     
    int main ()
    {
       dump (stdin);
       return 0;
    }
     
    D:\DEVELOPP\G\GANDALF\EXE>type main.c |proj.exe
    #include <stdio.h>
    #include <stdlib.h>
     
    #define BUFFERSIZE 1024
     
    void dump (FILE * stream)
    {
       char buffer[BUFFERSIZE];
       while (fgets (buffer, BUFFERSIZE, stream))
       {
          printf ("%s", buffer);
       }
    }
     
    int main ()
    {
       dump (stdin);
       return 0;
    }
    D:\DEVELOPP\G\GANDALF\EXE>
    Pas de Wi-Fi à la maison : CPL

  18. #18
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    De memoire, fgets echoue sur une erreur de lecture ou une fin de fichier. Or lors de l'utilisation de pipe (ou de la lecture d'un fichier) il n'y a pas une fin de fichier lorsque il n'y a rien a lire, et fgets attends jusqu'a voir une saisie validee par \n ou une fin de fichier. Si il n'y a plus rien a emettre, il faut donc soit forcer une fin de fichier, soit prevoir dans le "protocole" entre les deux appplications un marqueur de fin

  19. #19
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Emmanuel Delahaye > Effectivement comme cela ca marche, mais dans mon exemple ce n'était pas un cat (ou un type) mais un rsh... ou un telnet

    Dans la réalité le programme dont je recupere la sortie peux mettre plusieurs heures avant de donner son resultat, il n'est donc pas question pour moi de rester bloqué en attente. Il faut que je sois capable de determiner s'il y a quelque chose dans le pipe, ou pas...

  20. #20
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    Il faut que le resultat de rsh finisse par une fin de fichier (fin de commande par exemple (rsh machine ls | prog) la sa fonctionne
    rsh machine | prog attend la fin de finchier (Ctrl-D ou exit ) ceci est normal un rsh simple ouvre une session distante qui ce terminera avec le exit ou CTRL-D.
    Si tu ne veut pas rester en attente je ne vois guere de solution via les pipes, c'est justement la particularité d'un pipe d'être bloquant !
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/07/2012, 09h12
  2. Savoir si des données sont écrites sur un flux
    Par zapatta dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 12h27
  3. Réponses: 3
    Dernier message: 05/05/2006, 11h41
  4. [MySQL] Comment insérer des données contenant un "\" dans
    Par ALEX77 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/09/2005, 16h04
  5. Réponses: 3
    Dernier message: 25/07/2005, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo