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. #21
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Biensur , le voilà :
    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
    60
    61
    #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; 
     
    /* initialisation de la séquence */
    ligne =(char*)malloc(sizeof(char)*100);
    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,100,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);
     
     
    fseek(fichier_entree,0,SEEK_SET);
    nbseq=0;
    /* Ouverture en lecture seulement du fichier à traiter */
     
    /* Parcours du fichier jusqu'à la fin */
    while(!feof(fichier_entree)){
       /* lecture ligne par ligne*/
     
       ligne=fgets(ligne,100,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);	
    free(ligne); 
    }
    Désolée, pour tout à l'heure , je sais que vous m'aidez , et j'apprécie bcp votre aide , et je ne voulais dire que vous étize sexiste.

    Bon sinon , comme ça se fait que le code plante ou pas selon les machines ( je suis sous windows mais je teste mes codes dans un émulateur linux ( cygwin) et en même temps j'ai un copain qui est sous mac , en l'exécution de nos programmes différent d'un ordi à l'autre)

  2. #22
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Ps saute des lignes
    Merci

    Sinon, ne te fi pas au speudo, tu pouvais trouver plus de filles que tu ne penses en info

  3. #23
    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 Faiche
    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)
    rewind(fp);

  4. #24
    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 P'tite Nélodie
    Voici mon code :
    Déjà, ce code m'inquiète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:7: warning: return type defaults to `int'
    main.c: In function `main':
    main.c:10: warning: unused variable `sequence'
    main.c:59: warning: control reaches end of non-void function
    main.c:9: warning: 'ligne' might be used uninitialized in this function
    Linking console executable: C:\dev\forums\forums.exe
    Process terminated with status 0 (0 minutes, 5 seconds)
    0 errors, 4 warnings
    Ton code corrigé et commenté (-ed-)
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    #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 */
     
    /* -ed-
    main ()
     
    En C99, le type retourne doit etre explicite. */
    int main (void)
    {
       /* -ed- il est preferable d'avoir une definition unique et
          separee de ce genre d'info */
    #define FNAME "fasta.txt"
     
    #if 0                           /* -ed- */
       FILE *fichier_entree;
     
       char *ligne;
     
       char *sequence = "";
     
    /* initialisation de la séquence */
       int nbseq = 0;
     
       /* -ed- La portee de ces variable est trop grande.
          Le code est difficile a lire. */
    #endif
     
     
    /* Ouverture en lecture seulement du fichier à traiter */
       FILE *fichier_entree = fopen (FNAME, "r");
     
       /* -ed- fopen() peut echouer */
       if (fichier_entree != NULL)
       {
    /* Parcours du fichier jusqu'à la fin */
    /* -ed-
          while (!feof (fichier_entree))
          {
             ligne = fgets (ligne, 1000, fichier_entree);
    Ce n'est pas du tout comme ca que l'on lit un fichier texte.
    feof() ne fait pas ce que tu crois. Il faut tester la valeur
    retournee par la fonction de lecture. C'est aussi ici qu'il
    faut definir correctement la ligne et le compteur de sequences.
     
    */
    /* initialisation de la séquence */
          int nbseq = 0;
          char ligne[1000];
     
          while (fgets (ligne, sizeof ligne, fichier_entree) != NULL)
          {
             /* Traitement des lignes si ce n'est pas la fin du fichier */
             /* -ed- inutile
                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");
             }
             /* -ed- inutile
                }
              */
             //printf("ligne : %s \n",ligne);
          }
          printf ("Le fichier contient %d sequence\n", nbseq);
    /* Fermeture du fichier */
    /* -ed- inutile
          fclose (fichier_entree);
          */
          nbseq = 0;
    /* Ouverture en lecture seulement du fichier à traiter */
    /* -ed- inutile
          fichier_entree = fopen ("fasta.txt", "r");
          */
    /* -ed( ajoute */
          rewind (fichier_entree);
     
    /* Parcours du fichier jusqu'à la fin */
             /* lecture ligne par ligne */
          while (fgets (ligne, sizeof ligne, fichier_entree) != 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);
       }
       else
       {
          perror (FNAME);
       }
     
       /* -ed- parce que main() retourne un int. */
       return 0;
    }
    En sortie :
    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
    Ligne de commentaire
    SÚquence
    Ligne de commentaire
    SÚquence
    Ligne de commentaire
    SÚquence
    Ligne de commentaire
    SÚquence
    Le fichier contient 4 sequence
    Ligne de commentaire
    SÚquence
    Ligne de commentaire
    SÚquence
    Ligne de commentaire
    SÚquence
    Ligne de commentaire
    SÚquence
    Le fichier contient 4 sequence
     
    Press ENTER to continue.

  5. #25
    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 Faiche
    En fait si on compile avec visual il faut caster.
    Une connerie par post... T'es répéré...

    Non. Il faut apprendre à compiler en C quand on écrit en C... (l'extension doit être .c, par exemple et non .C ni .cpp...)

  6. #26
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    que je fasse rewind ou fseek j'ai toujours mon erreur de ségmentation

  7. #27
    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 P'tite Nélodie
    que je fasse rewind ou fseek j'ai toujours mon erreur de ségmentation
    Ce code fonctionne :

    http://www.developpez.net/forums/sho...9&postcount=24

  8. #28
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    J'ai testé ton code ED et il fonctionne bien chez moi. Je suis soulagée car d'habitude il n'est pas rare d'avoir des différences d'exécutions d'un ordi à l'autre.
    Je prend note de la marche à suivre pour effectuer une lecture correcte d'un fichier.
    Je me demande pourquoi les bouquins et les cours ne donnent pas cette syntaxe si c'est celle à employer, cela éviterai les problèmes comme les miens

    Merci pour cette solution

  9. #29
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    J'ai repris le code que tu avais corrigé et commenté.
    J'ai voulu juste changer une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* ligne=(char*)malloc(sizeof(char)*100)
    au lieu de Lors j'utilise l'allocation dynamique, l'exécution du programme : les lignes du fichier "séquence" sont lues plusieurs fois!!!

    Pourquoi cette bizarrerie ?? quelle est la différence exacte entre ces deux lignes de code ?

    Merci d'avance pour les explications

  10. #30
    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 P'tite Nélodie
    J'ai repris le code que tu avais corrigé et commenté.
    J'ai voulu juste changer une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* ligne=(char*)malloc(sizeof(char)*100)
    Pourquoi écrire du code aussi compliqué ?
    • Le cast est inutile
    • sizeof char vaut 1 par définition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* ligne=malloc(100);
    Par contre, il manque une chose importante comme le test pour savoir si malloc() a réussi et la libération du bloc alloué...
    au lieu de Lors j'utilise l'allocation dynamique, l'exécution du programme : les lignes du fichier "séquence" sont lues plusieurs fois!!!

    Pourquoi cette bizarrerie ?? quelle est la différence exacte entre ces deux lignes de code ?

    Merci d'avance pour les explications
    Si tu as laissé 'sizeof ligne' dans le fgets(), ça doit expliquer le problème. Un tableau et un pointeur, c'est pas la même chose. La tailled 'un pointeur, c'est quelques char (2, 4 ...).

    Il faut dans ce cas mettre 100 ou plutôt utiliser une variable contenant la taille (c'est le but).

    Mais je ne comprend pas pourquoi tu veux utiliser la mémoire dynamique ?

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Je ne suis pas fan de l'allocation dynamique. Mais mon prof oui et en plus avec toute la syntaxe.... pour mon projet je dois respecter certaines consignes comme faire plein de typedef, et des allocations dynamiques autant que possibles. Je ne comprends pas très bien ces consignes mais je ne peux pas y faire grand chose , à part les respecter le mieux possible.
    Voilà

    Bon sinon effectivement j'ai laissé le sizeof dans le fgets c'est peut etre pour ça qu'il y a une erreur.
    Mais bon si je peux me passer de ce malloc , je m'en passerai

    merci pour les conseils

  12. #32
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Quand tu devras faire des projets, beaucoup plus importants et qui demande beaucoup plus de ressources, tu comprendras l'utilé de l'allocation dynamique. Car l'allocation permettant de gerer la memoire,ça te permet de faire des choses que tu ne pourras jamais faire si tu donnes des tailles fixes.

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