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 fichier txt


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut lecture fichier txt
    Bonjour à tous!

    J'ai besoin de lire un fichier txt du style:

    3
    Vega
    23.698
    Rigel
    1256.987
    Beltegeuse
    54.87
    et d'en récupérer les données numériques et les chaines de caractères.
    Pour ca j'ai écrit le code suivant:

    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
     
    #include<stdio.h>
    #include<stdlib.h>
     
    main()
    {
       char *tab1[200];
       float tab2[200];
       int n,i;
       float luminosite_etoile;
       char nom_etoile[40];
     
       system("clear");
     
       FILE *donnees;
       donnees=fopen("donnees_exo.txt","r");
     
       /* lecture du fichier de donnees puis fermeture du fichier*/
       fscanf(donnees,"%d",&n);
     
       for(i=0;i<n;++i)
       {
          fscanf(donnees,"%s",nom_etoile);
          fscanf(donnees,"%f",&luminosite_etoile);
          tab1[i]=nom_etoile;
          tab2[i]=luminosite_etoile;
       }
       fclose(donnees);
     
       /* affichages*/
       for(i=0;i<n;++i)
       {
          printf("luminosite%d = %f\n",i+1,tab2[i]);
       }
       printf("\n\n");
     
       for(i=0;i<n;++i)
       {
          printf("nom de l'étoile %d = %s\n",i+1,tab1[i]);
       }
       printf("\n\n%s",tab1[0]);
    }
    Ca marche pour lire les données numériques et les placer dans le tableau tab2 mais pas pour les chaines de caractères. Il semble que seule la dernière soit lue ("Beltegeuse") et tous les éléments du tableau tab1 sont "Beltégeuse".

    Quelq'un a une idée?

    Merci.

  2. #2
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Normal..
    Quand tu fais ton fscanf, tu modifie une zone mémoier situé à l'endroit indiqué par ton pointeur. Ensuite tu copie ton pointeur. Mais c'est toujours la même zone mémoire qui est pointée, et fscanf apres fscanf, tu réecris dessus... Au final, tu vois seulement la dernière chose écrite, cad la dernière ligne lue.

    Au passage, il serait plus sain d'utiliser fgets que fscanf.

  3. #3
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Yo !

    J'ajouterai :
    1) main renvoie int
    2) il faudrait que tu testes que l'ouverture de fichier avec fopen s'est bien passé (on ne sait jamais )
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ok je crois avoir compris. Mais que faire alors pour résoudre ce problème. Que proposez vous ?
    Pour le test du EOF fichier, je vais le rajouter.

  5. #5
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Points : 9
    Points
    9
    Par défaut un peu le meme probleme
    Bonjour,

    J'ai un peu le meme probleme que stephaneamadeus.
    Je cherche aussi a extraire des données d'un fichier .txt afin de les mettre dans un tableau. Ces données sont de type int et sont decimales.

    j'ai taper le code suivant :

    fichierson = fopen("fichierson.txt","r");//ouverture du fichier en lecture

    for(k=0;k<Ncanal;k++){
    fscanf(fichierson,"%d",&kk);
    donnee[k]=kk;
    }

    Le probleme est que lorsque j'affiche le tableau *donnee, il ne contient que des 00, alors que mon fichier txt contient bien des valeurs...


    les valeurs dans le fichier txt sont ecris avec un \n entre chaque valeur.


    Merci d'avance de vos conseils

  6. #6
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Quelquechose qui pourrait solutionner le problème ( avec le minimum de correction, ce n'est donc pas forcement la meilleure approche )

    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
     
    #include<stdio.h>
    #include<stdlib.h>
     
    int main(void)
    {
    char *tab1[200];
    float tab2[200];
    int n,i;
    float luminosite_etoile;
    char nom_etoile[40];
     
    system("clear");
     
    FILE *donnees;
     
    donnees=fopen("donnees_exo.txt","r");
     
    /* lecture du fichier de donnees puis fermeture du fichier*/
     
    fscanf(donnees,"%d",&n);
    /* Il faudrait peut-etre vérifier que n est inférieur a 200 */
     
    for(i=0;i<n;++i)
    {
    fscanf(donnees,"%s",nom_etoile);
    fscanf(donnees,"%f",&luminosite_etoile);
    /* alloue de la mémoire pour tab[i] et recopie les données */
    tab1[i]= malloc(strlen(nom_etoile)+1);
    if ( tab1[i] == NULL ){
       /* gérer l'erreur */
    } else {
       strcpy(tab1[i],nom_etoile);
    }
    tab2[i]=luminosite_etoile;}
     
    fclose(donnees);
     
    /* affichages*/
     
    for(i=0;i<n;++i)
    {printf("luminosite%d = %f\n",i+1,tab2[i]);}
     
    printf("\n\n");
     
    for(i=0;i<n;++i)
    {printf("nom de l'étoile %d = %s\n",i+1,tab1[i]);}
     
    printf("\n\n%s",tab1[0]);
    }
    togzzz, je ne pense pas que ton problème soit le même, les entiers sont copiés, on n'ecrase donc pas la zone mémoire sans avoir copié la valeur.

  7. #7
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Points : 9
    Points
    9
    Par défaut j'ai resolu mon probleme
    j'avais en fait un probleme de passage d'un argument int a un float....

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci zul, ton code marche nickel !!!
    J'aimerais comprendre pourquoi il y a besoin de déclarer le tableau tab1 dynamiquement, puisque je lui réservais déjà de la place mémoire dans les déclarations de variables. Mais si je le fais pas, j'ai bien un segmentation fault.

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Deux remarques sur ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      // il ne faut pas oublier de libérer la mémoire 
      for(i=0;i<n;++i)
        free(tab1[i]);
     
      // il faut retourner une valeur au système
      return 0;
    }
    Peut-être que ton compilateur accepte strdup, qui fait le malloc et la recopie de la chaine ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. Lecture fichier "txt"
    Par heyax dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/01/2008, 16h03
  2. Lecture fichier txt vers tableau alloué
    Par yeboum dans le forum Fortran
    Réponses: 3
    Dernier message: 27/11/2007, 09h31
  3. Lecture fichier TXT
    Par Oncle_Pete dans le forum Delphi
    Réponses: 5
    Dernier message: 16/07/2007, 16h43
  4. Lecture fichier txt
    Par licorne dans le forum C
    Réponses: 3
    Dernier message: 03/04/2006, 17h14
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

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