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 :

pb lecture de fichier


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut pb lecture de fichier
    Bonjour,
    dans le cadre d'un projet , je dois lire un fichier texte et récupérer certaines informations.
    Mon fichier à traiter possède ce format là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >Sequence 1
    cccaaaaccactcaaaccattactcaaaccccaattcccaatatcgtcaa
    tcaaacaacggcaacagaactagtaacccgtttaaagataataaaacaaa
    >Sequence 2
    ttatgggctacacaacatagaagaagaaaaactcacccaacactgcctta
    ccaacttaaattttcaggcacccgcctcaggaacccaacaggatacataa
    >sequence 3
    atcctaccacacatgcaacatcccttccatacataactctaaacctccaa
    caaaaattccctttatcatttcttatcgatacaggatccaataactcctt
    >Sequence 4
    cattgacccagaatctgcaaaccaactagagtgcacaattctaccaacat
    ccacttcaattacaacagcattaaatagtttcaaaattgaagaaaaggca
    atattcccaatgccacccgagttcaaaaccgaaggtcaaattaccctact
    Je lis une première fois mon fichier afin de compter le nombre de séquences qu'il contient ( je compte les lignes commençant par >).Puis je ferme le fichiers. Je créé un tableau de chaines de caractères ayant la taille nécessaire. Je réouvre mon fichier et je récupère que les lignes différentes de >.... et je les stocke dans mon tableau.
    Le problème c'est je ne peux pas réouvrir une seconde fois mon fichier, et cela même si je l'ai bien fermé. J'ai une erreur d'exécution " segmentation fault" ou alors "bus error" ( je l'ai testé sous un autre pc).
    Voici mon code :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h>
    #include <string.h>
    /* Nom : lecturefasta.c */
    /* Date  : 12 octobre 2006 */
    /* But : lecture d'un fichier fasta et récupération des séquences */
     
    main(){
    FILE* fichier_entree;
    char* ligne; 
    char* sequence="";
    /* initialisation de la séquence */
     
    int nbseq=0;
    /* Ouverture en lecture seulement du fichier à traiter */
    fichier_entree = fopen("fasta.txt","r");
    /* Parcours du fichier jusqu'à la fin */
    while(!feof(fichier_entree)){
       /* lecture ligne par ligne*/
     
       ligne=fgets(ligne,1000,fichier_entree);
       /* Traitement des lignes si ce n'est pas la fin du fichier */
       if (ligne!=NULL){
       	  /* détection d'une ligne de commetaire */
      	  if(strchr(ligne,'>')!=NULL){
    	      nbseq++;
              printf("Ligne de commentaire\n");	
          }else{
    	      printf("Séquence\n");
          }
       }
       //printf("ligne : %s \n",ligne);
    }
    printf("Le fichier contient %d sequence\n",nbseq);
    /* Fermeture du fichier */
    fclose(fichier_entree);
      nbseq=0;
    /* Ouverture en lecture seulement du fichier à traiter */
    fichier_entree = fopen("fasta.txt","r");
    /* Parcours du fichier jusqu'à la fin */
    while(!feof(fichier_entree)){
       /* lecture ligne par ligne*/
     
       ligne=fgets(ligne,1000,fichier_entree);
       /* Traitement des lignes si ce n'est pas la fin du fichier */
       if (ligne!=NULL){
       	  /* détection d'une ligne de commetaire */
      	  if(strchr(ligne,'>')!=NULL){
    	      nbseq++;
              printf("Ligne de commentaire\n");	
          }else{
    	      printf("Séquence\n");
          }
       }
       //printf("ligne : %s \n",ligne);
    }
    printf("Le fichier contient %d sequence\n",nbseq);
    /* Fermeture du fichier */
    fclose(fichier_entree);	 
    }
    ce code ne récupère pas les séquences à la deuxième lecture, c'est juste un fichier test qui fait deux lecture à suite.
    Si je fais une seule lecture tout fonctionne correctement , enfin chez moi , mais deux lecture de fichiers à la suite non ...

    pouvez vous me dire pourquoi et comment résoudre ce problème?
    merdi d'avance.

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Si c'est le même fichier que tu lis les deux fois, plutot que de le fermer et de le réouvrir, fait un fseek a la position de départ (me souvient plus de la syntaxe exacte)

  3. #3
    Membre éclairé Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h>
    #include <string.h>
    /* Nom : lecturefasta.c */
    /* Date  : 12 octobre 2006 */
    /* But : lecture d'un fichier fasta et récupération des séquences */
     
    main(){
    FILE* fichier_entree;
    char* ligne; 
    char* sequence="";
    /* initialisation de la séquence */
     
    int nbseq=0;
    /* Ouverture en lecture seulement du fichier à traiter */
    fichier_entree = fopen("fasta.txt","r");
    /* Parcours du fichier jusqu'à la fin */
    while(!feof(fichier_entree)){
       /* lecture ligne par ligne*/
     
       ligne=fgets(ligne,1000,fichier_entree);
       /* Traitement des lignes si ce n'est pas la fin du fichier */
       if (ligne!=NULL){
       	  /* détection d'une ligne de commetaire */
      	  if(strchr(ligne,'>')!=NULL){
    	      nbseq++;
              printf("Ligne de commentaire\n");	
          }else{
    	      printf("Séquence\n");
          }
       }
       //printf("ligne : %s \n",ligne);
    }
    printf("Le fichier contient %d sequence\n",nbseq);
    /* Fermeture du fichier */
    fclose(fichier_entree);
      nbseq=0;
    /* Ouverture en lecture seulement du fichier à traiter */
    fichier_entree = fopen("fasta.txt","r");
    /* Parcours du fichier jusqu'à la fin */
    while(!feof(fichier_entree)){
       /* lecture ligne par ligne*/
     
       ligne=fgets(ligne,1000,fichier_entree);
       /* Traitement des lignes si ce n'est pas la fin du fichier */
       if (ligne!=NULL){
       	  /* détection d'une ligne de commetaire */
      	  if(strchr(ligne,'>')!=NULL){
    	      nbseq++;
              printf("Ligne de commentaire\n");	
          }else{
    	      printf("Séquence\n");
          }
       }
       //printf("ligne : %s \n",ligne);
    }
    printf("Le fichier contient %d sequence\n",nbseq);
    /* Fermeture du fichier */
    fclose(fichier_entree);	 
    }

    tu n'as pas alloué de mémoire pour la variable ligne, tu dois faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = (char*)malloc(1000);
    apres sa déclaration.

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    ou char ligne[1000]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Oui mais vu que la variable ligne est déclarée en pointeur, il faut lui allouer de la mémoire.

    ligne = (char*)malloc(1000);

  6. #6
    Membre éclairé Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    Citation Envoyé par theshark85
    Oui mais vu que la variable ligne est déclarée en pointeur, il faut lui allouer de la mémoire.

    ligne = (char*)malloc(1000);
    Et bien sur ne pas oublier de désallouer la mémoire en fin de programme !!

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Oui bien sur, on fait toujours le ménage quand on part.

  8. #8
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par theshark85
    Oui mais vu que la variable ligne est déclarée en pointeur, il faut lui allouer de la mémoire.

    ligne = (char*)malloc(1000);
    Pas besoin de faire un cast en (char*) car la fonction malloc() renvoie un pointeur non typé (void *).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ligne = malloc(1000 * sizeof(char));

  9. #9
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    En fait si on compile avec visual il faut caster. Alors je ne sais pas si c'est le c++ ou juste visual, mais voila, la syntaxe est justifiable :p

    Notez qu'avec un char[1000] on alloue pas et on ne free pas.

  10. #10
    Membre éclairé Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    Citation Envoyé par homeostasie
    Pas besoin de faire un cast en (char*) car la fonction malloc() renvoie un pointeur non typé (void *).
    void n'est pas mon ami,alors des que je peux le faire disparaitre

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut
    Mise à part cette allocation dynamique de ma variable ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne =(char*)malloc(sizeof(char)*100);
    , ainsi que l'utilisation d'un joli free à la fin du programme, j'ai toujours une erreur de ségmentation à la deuxième lecture du fichier et cela malgrè l'utilisation de fseek dont j'ai vérifié la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(fichier_entree,0,SEEK_SET);

  12. #12
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    ah, si c'est un seg fault c'est plus pareil !

    Dans ces cas la, il faut utiliser un debuggeur (gdb est le plus simple) : tu compiles avec l'option -g, et tu lances gdb <ton_prog> et ensuite tu fais run <args>

    Quand le programme se prends le segfault, gdb te donne la ligne, et tu peux connaitre les valeurs avec p <variable>

    ps : et je sais que c'est indigne de ma part de demander un truc pareil, mais t as bien viré les fclose et fopen du milieu quand t as mis le fseek hein ?

    EDIT: oui en fait c'est pas que c'est plus pareil, mais que j'avais pas vu au début qu'il y avait un segfault :p

  13. #13
    Membre éclairé Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    Citation Envoyé par P'tite Nélodie
    Mise à part cette allocation dynamique de ma variable ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne =(char*)malloc(sizeof(char)*100);
    , ainsi que l'utilisation d'un joli free à la fin du programme, j'ai toujours une erreur de ségmentation à la deuxième lecture du fichier et cela malgrè l'utilisation de fseek dont j'ai vérifié la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(fichier_entree,0,SEEK_SET);
    ajoute un test sur tes fopen pour tester si ta variable fichier_entree n'est pas null ( cela peut arriver si tu as pas le fichier fasta.txt dans le bon repertoire), et dans ce cas la tu auras une segfault avec le eof

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut
    oui quand même je sais bien que je suis une fille mais je ne suis pas bête !!
    en fait , j'ai fait plein de printf dans mon code pour savoir après quelle instruction ça plante et je sais que c'est au niveau de la fonction fgets dans la seconde lecture

  15. #15
    Membre éclairé Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    Citation Envoyé par P'tite Nélodie
    oui quand même je sais bien que je suis une fille mais je ne suis pas bête !!
    Aucun de nous a fait preuve de sexisme, et qd tu recherches un bug, meme les trucs les plus simples doivent etre vérifiés.
    D'autre part, on t'aide alors ne nous dénigre pas trop.
    autre point, j'ai compilé ton prog chez moi et ca marche, le seul cas qui plante est qd le fameux pointeur n'est pas testé!!!!

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Oui comme vient de le souligner telliam, tu ne test pas si ton fihcier est bien ouvert.

    Sinon passe ton programme en mode debug, rien de tel quand tu as des erreurs memoire. Tu essais d'accede a des endroits ou tu n'as pas le droit.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut
    J'ai suivi ton conseil pour bdg mais je ne suis pas plus avancé car voilà le message que j'obtiens :
    "Program received signal SIGSEGV, Segmentation fault.
    0x77f47bd2 in ntdll!RtAppendStringToString() from ntdll.dll "

    Si tu sais à quoi ça correspond , je veux bien ta traduction

  18. #18
    Membre éclairé Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    peux-tu nous redonner ton code?

  19. #19
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    tu peux faire la commande bt (backtrace) qui te montre la liste des appels de fonctions, pour voir à quelle occasion cette fonction a été apellée

    Sinon, en fonction de l edi avec lequel tu travailles, le mode debug integré te permet de voir dans ton code tous les éléments dont tu a besoin..

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    En gros et en moche, tu tapes pas ou il faut.
    Pas tres explicite.

    As tu rajouter ce qui t'a ete conseille.
    La verification quand tu ouvres tes fichiers pour les fopen.
    C'est une base ça, ne jamais oublié de teste.
    Sinon pour moi, le code que j'ai lu, tu fais deux fois la même chose, mais pi etre voulu.

    Sinon, un bon debug, vaut mieu que des printfs. Car l'erreur peut aussi bien venir d'avant le printf, que apres. Ils peuvent servir, pour localiser le probléme, mais c'est tout.

    Stp, peux tu remettre ton code en sautant des lignes, car c'est pas pratique à lire là

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