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

C Discussion :

Lecture de fichier


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut Lecture de fichier
    bjr à tous , j'aimerais avoir une petite explication sur la lecture des fichiers en C car j'arrive à lire un fichier mais quand je veux utiliser la fonction fgetpos pour me retourner la position dans le fichier et continuer ma lecture jusqu'en fin de fichier là je n'y arrive pas ; voiçi le code.
    MErçi à tous


    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
    /* lecture du fichier */ 
                  fic=fopen(final,"r+b");           
                  if (fic==NULL) printf("problème ouv lecture %s\n",final);      
                   fread(&pr2,sizeof(struct  processus),1,fic);
                   printf("Lu dans le fichier :%s\n",final); 
                   printf("Numéro d'équipe : %d\n",pr2.num_equipe);
                   printf("PID processus : %d\n",pr2.pid);
                   do
                      {
                        printf("içi boucle do while\n");
                        pos=fgetpos(fic,position);  
                        fseek(fic,SEEK_SET,pos);    
                        fread(&pr2,sizeof(struct  processus),1,fic);
                        printf("Lu dans le fichier :%s\n",final); 
                        printf("Numéro d'équipe : %d\n",pr2.num_equipe);
                        printf("PID processus : %d\n",pr2.pid);
                      }
                   while    (fin_fic=feof(fic)==0) ;

  2. #2
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Par défaut
    Salut,

    Ca manque de code... On sait pas de quel type sont tes variables.
    Poste la fonction entiere.
    Aere ton code !!!!!!
    Et surtout poste un code qui montre clairement ton soucis, parce que la, on ne sait pas si qu'est-ce qui cloche.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par Zoltan_K Voir le message
    Salut,

    Ca manque de code... On sait pas de quel type sont tes variables.
    Poste la fonction entiere.
    Aere ton code !!!!!!
    Et surtout poste un code qui montre clairement ton soucis, parce que la, on ne sait pas si qu'est-ce qui cloche.
    merçi pour ta réponse voiçi les variables du 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
     
    int i,equ,ind,randomValue,ret,Nb_lu,fin_fic,pos;
    pid_t pid,pid_pere,pidFils[5],pid2;
    int tubes[5][2];
    char final[6];
    char buf[5];
    char f='F';
    fpos_t *position;
     
    struct processus
      {
        int num_equipe;
        int pid;
      };
    et dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       FILE *fic;
       struct processus pr,pr2;
       int nb_ecrits = 0;

  4. #4
    Membre confirmé Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Par défaut
    Salut!
    En fait si c'est pour récupérer la position courante ou s'est arrêté le curseur dans le fichier tu devra utiliser ftell. ça marche bien et c'est fait pour ça.
    Ainsi pour te repositionner in faut utiliser fseek comme tu l'as fait en plaçant tell. Pour le fgetpos que t'as utiliser, celà ne marche que si tu as récupéré la position avec fsetpos. Voilà!
    Tu peux faire un truc de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int tell=0;
    tell=ftell(pointeur_du_fichier);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int tell=0;
    tell=ftell(pointeur_du_fichier)-sizeof(ta structure);
    Bien essaie tout ça et tu me diras s'il ya quelque chose qui cloche! Bon code ;-)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par doderic Voir le message
    Salut!
    Pour le fgetpos que t'as utiliser, celà ne marche que si tu as récupéré la position avec fsetpos. Voilà!

    [/code]

    Bien essaie tout ça et tu me diras s'il ya quelque chose qui cloche! Bon code ;-)
    Bonjour et merçi pour ta réponse . On va y aller par étape si tu veux bien ; en fait j'ai essayé fsetpos et curieusement quand je lui demande d'afficher pos il ne le fait pas pareil avec fgetpos là je comprends pas pourquoi il passe directement à la suite du programme sans tenir compte de la boucle do...while
    Voilà si tu peux m'expliquer... MERCI encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     do
                      {
                        printf("içi boucle do while\n");
                        pos=fsetpos(fic,position);
                        printf("pos = %d\n",pos);
                     
                       
                     } 
                  while    (fin_fic=feof(fic)!=0); /* quand fin_fic = 0 fin de fichier */

  6. #6
    Membre confirmé Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Par défaut
    Salut!
    Bien je pense que je me suis un peu mal exprimé. En fait il ya deux choses. Si tu utilises fgetpos pour récupérer une position, c'est avec fsetpos que tu dois te positionner et non avec fseek. Bien! Pour utiliser fseek, alors tu dois avoir récupéré la position courante avec ftell comme je te l'ai dis. Reprenons ce que j'ai donné hier comme code et voyons ce que ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ... //tes instructions
    int position=0;
    position=ftell(fic);
    ...
    quand tu reviens à lapartie du code ou tu dois récupérer la position, il te suffira de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...//instructions diverses
    fseek(fic,position,SEEK_SET);
    ...
    En fait, je ne sais pas si c'est trop clair maintenant mais tu peux toujours dire si c'est pas le cas.

  7. #7
    Membre confirmé Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Par défaut
    Apparemment tu utilises fwrite pour écrire ds ton fichier vu que tu relis avec fread. Je te proposerai d'utiliser fprintf pour écrire et fgets pour lire, comme ça tu sais toi même à peu près ce que tu fais car fwrite et fread sont plutot adaptés aux fichiers binaires qu'aux fichiers texte...

    En voyant de plus près tu n'as même pas besoin de te positionner, la boucle while te fera tout.
    n'utilise pas do..while, utilise plutot while tout court. Regarde ceci:
    NB: utilises le seulement si tu changes ta façon d'écrire dans le fichier. Ce exmple ne marchera que si dans le fichier, les données sont écrites chacune sur une ligne genre
    ...
    Numéro d'équipe
    PID processus
    Numéro d'équipe
    PID processus
    Numéro d'équipe
    PID processus
    ... //Ainsi de suite


    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
     
    int position=0;
    ...
    fic=fopen(final,"r+b");           
    if (!fic) 
    printf("problème ouv lecture %s\n",final); 
     
    fgets(pr2.num_equipe,sizeof(struct processus),fic);
    fgets(pr2.pid,sizeof(struct processus),fic);
    printf("Lu dans le fichier :%s\n",final); 
    printf("Numéro d'équipe : %d\n",pr2.num_equipe);
    printf("PID processus : %d\n",pr2.pid);
     
    while(!feof(fic))
    {
    fgets(pr2.num_equipe,sizeof(struct processus),fic);
    fgets(pr2.pid,sizeof(struct processus),fic);
    printf("Lu dans le fichier :%s\n",final); 
    printf("Numéro d'équipe : %d\n",pr2.num_equipe);
    printf("PID processus : %d\n",pr2.pid);
    }
    Essaie de nouveau tout ça et tu me diras, ça doit marcher. Pour l'écriture dans le fichier avec fprintf ça doit ressembler à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fprintf(fic,"%d\n",pr2.num_equipe);
    fprintf(fic,"%d\n",pr2.pid);
    Voilà, essaie le tout
    Bon code à toi

  8. #8
    Membre confirmé Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Par défaut
    Hi! je me suis dis qu'au cas où tu aimerais garder ton fread alors le code qui coreespondrait est ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    fread(pr2,sizeof(struct processus),1,fic);
    printf("Lu dans le fichier :%s\n",final); 
    printf("Numéro d'équipe : %d\n",pr2.num_equipe);
    printf("PID processus : %d\n",pr2.pid);
     
    while(fread(pr2,sizeof(struct processus),1,fic));
    {
    printf("Lu dans le fichier :%s\n",final); 
    printf("Numéro d'équipe : %d\n",pr2.num_equipe);
    printf("PID processus : %d\n",pr2.pid);
    }
    C'est bon now! A+ et n'oublie de passer en mode résolu si c'est fait

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Merçi Doderic pour ta chaleureuse contribution en fait j'ai voulu absolument utiliser fgetpos et fsetpos mais en vain, je me suis " résolu" à utiliser ftell avec fseek et là effectivement ça marche voiçi le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while(!feof(fic))
                      {
     
                        position=ftell(fic);
                        printf("pos = %d\n",position); 
                        fseek(fic,position,SEEK_SET);                  
                        fread(&pr2,sizeof(struct  processus),1,fic);
                        printf("Lu2 dans le fichier :%s\n",final); 
                        printf("Numéro d'équipe2: %d\n",pr2.num_equipe);
                        printf("PID processus2 : %d\n",pr2.pid);
                     }
    où position est de type int

    Par contre sais tu comment utiliser fgetpos et fsetpos? Car moi je l'ai écrit comme ça et il "zappe " complètement mes requetes !!! (je veux dire fonctions)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                       pos=fgetpos(fic,position);
                       fsetpos(fic,position);
    où pos est de type int et position de type pointeur fpos_t

    Voilà si tu sais comment les utiliser ...
    Merçi bcp en tout cas pour ta sympathie !!! A +

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    As-tu initialisé position avec l'adresse d'un fpos_t ?

    On devrait avoir le schéma suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fpos_t position;
     
    pos=fgetpos(fic,&position);
    if(pos == 0)
    {
     //OK
      ....
     pos = fsetpos(fic,&position);
     if(pos == 0) // OK
      ....

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par diogene Voir le message
    As-tu initialisé position avec l'adresse d'un fpos_t ?

    On devrait avoir le schéma suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fpos_t position;
     
    pos=fgetpos(fic,&position);
    if(pos == 0)
    {
     //OK
      ....
     pos = fsetpos(fic,&position);
     if(pos == 0) // OK
      ....
    Merçi pour ta réponse j'ai essayé ta suggestion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fpos_t *position; 
    int pos;
    ....
      pos=fgetpos(fic,&position);
       if(pos == 0)
     
     
     
             pos = fsetpos(fic,&position);
    hélas à la compil j'ai l'erreur

    projet.c:107: attention : passing argument 2 of «fgetpos" from incompatible pointer type
    projet.c:112: attention : passing argument 2 of «fsetpos" from incompatible pointer type
    et là je comprends pas car position est de type pointeur comme le déclare d'ailleurs le man. il devrait donc accepter cette écriture "&"
    Merçi de ton aide si tu peux m'éclairer A +

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pas d'étoile
    position est ici du type fpos_t. Alors, dans les appels, &position sera du type fpos_t*

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par diogene Voir le message
    Pas d'étoile
    position est ici du type fpos_t. Alors, dans les appels, &position sera du type fpos_t*
    effectivement là ça marche autant avec fgetpos/fsetpos qu'avec ftell/fseek, par contre tu peux m'expliquer à quoi correspond exactement le type fpos_t ?
    Une structure de type pointeur ?
    J'ai un autre problème ce code m'écrit 2 fois la meme valeur :
    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
     
    struct processus
      {
        int num_equipe;
        int pid;
      };
    ...
    // écriture fichier
                  fic=fopen(final,"ab"); 
                  if (fic==NULL)
                    {
                       printf("problème ouv écriture %s\n");
                       printf("fic = %d\n",fic);
                    }  
                  nb_ecrits=fwrite(&pr,sizeof(struct  processus),1,fic);
                  printf("nb ecrits = %d\n", nb_ecrits);
                  fclose(fic);
    En fait ce qui se passe à la lecture du fichier j'ai 2 fois la meme valeur (2 fois la structure pr du type processus et encore autre chose quand j'ouvre avec VI mes fichiers écrit par ma procedure VI me donne ceci incompréhensible !!!
    ^A^@^@^@w^Z^@^@

    Merçi pour ton aide A +

  14. #14
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    quand j'ouvre avec VI mes fichiers écrit par ma procedure VI me donne ceci incompréhensible !!!
    ^A^@^@^@w^Z^@^@
    mais ton écriture de la structure est faite en binaire. Tu ne peux pas relire avec un éditeur de texte.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par diogene Voir le message
    mais ton écriture de la structure est faite en binaire. Tu ne peux pas relire avec un éditeur de texte.

    Merçi pour ta réponse
    ok donc c'est normal ? on peur le relire avec quoi ?
    Merçi

  16. #16
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    ok donc c'est normal ? on peur le relire avec quoi ?
    Bien, quasiment rien. Tu peux faire un programme qui relise le fichier. Ou utiliser un programme de lecture de fichier en hexadecimal et faire toi-même l'interprétation de ce qui est écrit .

    Si tu poses cette question, c'est que tu avais certainement l'intention d'écrire tes données dans un fichier texte. Il te faut utiliser au lieu de fwrite, des fonctions d'écritures formattées (fprintf) et ouvrir le fichier en mode texte (mode = "a" sans b).

  17. #17
    Membre confirmé Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Par défaut
    C'est Normal que ça affiche des trucs bizarres vu que utilises fwrite pour écrire dans le fichier (cette fonction écritles trucs en binaires). Pour résoudre ton problème, il falloir écrire ou chercher sur le net un algo pour convertir du binaire en ASCII avant d'afficher le texte. Je vais te lécrire mais tu peux aussi chercher. Au cas où ça t'emmerde tout ça, alors utilise tout simplement fprintf et fgets pour écrire et lire. Pas mieux ;-). Tu préfères quelle solution ?(des deux)

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par doderic Voir le message
    C'est Normal que ça affiche des trucs bizarres vu que utilises fwrite pour écrire dans le fichier (cette fonction écritles trucs en binaires). Pour résoudre ton problème, il falloir écrire ou chercher sur le net un algo pour convertir du binaire en ASCII avant d'afficher le texte. Je vais te lécrire mais tu peux aussi chercher. Au cas où ça t'emmerde tout ça, alors utilise tout simplement fprintf et fgets pour écrire et lire. Pas mieux ;-). Tu préfères quelle solution ?(des deux)
    Merçi pour ta réponse Doderic; je préfèrerais ne pas utiliser fprintf/fgets car je dois créer des fichiers binaires, si tu as une solution pour transformer du binaire en ASCII avant l'affichage merçi de me la faire passer, si tu as le temps bien-sûr rien d'urgent c'est juste pour terminer un projet de cours en C. Merçi encore
    A +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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