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 texte


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    Par défaut lecture de fichier texte
    bonjour a tous. Je suis debutant en programmation , et pour les besions de mon stage, je dois ecrire un petit programme qui recupere des donnees d'un fichier texte: Un petit coup de pouce serai donc le bien venu.

    Voici comment se presente le fichier texte

    essai n bla bla
    12.4; 45.55;
    15.5; 100.90;
    le nb de mesure n'etant pas connu. Ms celui ci est a peu de chose pres egale au nb de ligne du fichier texte

    Je voudrai donc faire le premiere collone du fichier txt a un type de donnees (par exemple tps) et la deuxieme colonne a la vitesse

    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
    double tps[15];
    double vit[15];
    double *ptr_tps = tps[0];
    double *ptr_vit= vit[0];
    FILE *fi
     
    fi = fopen("fichier.txt","r");
    for (i=a; i=b;i++)
    {   
       //où a correspond a la premiere ligne ou il y a des donnees, et b la derniere. IL faut donc pouvoir les determiner, et je ne sais pas comment on fait
       scanf(fi, "%lf", tps[i]);
       scanf(fi, "%lf", vit[i]);
       ptr_tps++;
       ptr_vit++;   
    }
    voila. Merci pour votre aide

  2. #2
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    le probleme etant que le petit programme ne marche pas du tout. Il n'est pas tres complet. Mais j'ai fait ce que j'ai pu avec mes peu de connaissance.

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 346
    Points : 439
    Points
    439
    Par défaut
    Bonjour,

    Premierement merci d'indenter le 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
     
     
    char buffer[256];
     
    if ((fi = fopen("fichier.txt","r")== NULL) {
      /* tjs tester si on a pu ouvrir un fichier */
      fprintf(stderr, "pb ....");
      exit(EXIT_FAILURE);
    }
     
    while ((fgets(ligne, sizeof(ligne), f) != NULL) {
      // tu travailles avec ta ligne (man strtok pour toi)
     ...
    }

    Bon courage,

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    la réponse de nicolas est presque complète.

    fgets et strtok seront tes alliés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double *ptr_tps = tps[0];
    double *ptr_vit= vit[0];
    je ne suis pas très sûr que ceci soit intéressant.
    Tu déclares 2 pointeurs qui n'ont pas d'intérêt.

    quand tu rentreras tes données dans tps et vit, il te suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    i=0;
    while(fgets ... ) {
    ...
    tps[i] = valeur_recuperee
    vit[i++] = valeur_recuperee
    ...
    }
    note bien qu'on n'incrémente i qu'une fois et qu'on l'initialise à 0 avant la boucle

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    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
     
    #include<stdio.h>
    #include<io.h>
     
     
    int main(){
     double a[15];
     double b[15];
     FILE *file; int  i;
     double *ptr_a= &a[0];
     double *ptr_b= &b[0];
     char ligne;
     file = fopen("nb.txt", "r");
      if((file = open("nb.txt", "r"))==NULL){
        exit(1);
       }
      while(fgets(ligne, sizeof(ligne),file)!= NULL){
       fscanf(file, "%lf", ptr_a[ligne]);\\?
       fscanf(file, "%lf", ptr_b[ligne]);
       ptr_a++;
       ptr_b++;
     
    }
     fclose(file);
     printf("%lf\n", a[0]);\\verification
     printf("%lf", a[1]);\\verification
     return; 
    }

    pour char ligne[], je met quoi entre les crochets, car je ne connais pas encore le numero de la derniere ligne.

    [/code]

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 346
    Points : 439
    Points
    439
    Par défaut
    A moins que tu aies des lignes immenses, même plus petit.
    Dans mon post précédent il fallait lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char ligne[256]  // et non char buffer[256]
    Voilà ce qui a dû te dérouter.

    Mais tu as pas besoin de connaître le nombre de lignes.
    La variable "ligne" contient une ligne de ton fichier texte.


    Par ailleurs je doute que tes fscanf soient adaptés et tu vas avoir des erreurs car tu ne vas pas faire sauter les ';' de cette façon et tu vas lire n'importe quoi. Donc utilise strtok.

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    ok
    je vais essayer
    pour les ligne, j'en ai en general un paquet.
    merci

  8. #8
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    je ne comprend pas bien l'utilisation de strtok

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <string.h> 
    char *strtok(char * restrict s1,const char * restrict s2);
    pour s2, je pense avoir pige, je mets ;
    mais pour s1, je ne vois pas, car je ne connais le contenu de la ligne

    mais une fois la chaine coupe, comment je fait pour dire que le premier element de la chaine doit correspondre a tps[0] et le deuxieme a vit[0];
    puis en passant a la ligne suivante , le premier a tps[1 et le second a vit[2]

    merci pour votre patience
    (mais je suis un super debutant en info)

  9. #9
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    déjà essaie de faire un truc.

    Avant même de faire un quelconque traitement sur le string que tu récupères (ligne), dans ta boucle, fais un
    Pour voir si ton fichier est bien parcouru en entier.
    S'il te ressort ton fichier tel quel, c'est déjà pas mal.

    Ensuite tu dois travailler sur le string ligne.
    Essaie d'aller voir ce lien
    http://www.cplusplus.com/ref/cstring/

    tu y trouveras toutes les fonctions qui sont dans string.h et qui te permettront de manipuler ton string. Il y a même des exemples de code.

    Et je te répète encore une fois que tes pointeurs sur ton tableau son inutiles.

    Lis bien mon précédent post s'il te plaît.
    Si tu utilises i pour te balader dans ton tableau, ça suffit amplement, de plus, ça te permettra de récupérer le nombre de ligne de ton fichier.

    pour ce qui est de l'utilisation de strtok, tu dois l'utiliser une première fois, travailler sur le string en récupérant les données intéressantes qu'il contient, les mettre dans ton tableau, et ensuite réutiliser strtok pour avoir l'autre valeur.

  10. #10
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    Pour les pointeurs ok, je les ai enleve.
    ensuite en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     while(fgets(ligne, sizeof(ligne),file)!= NULL){
         i++;
         printf("%s", ligne);
      }
    j'ai toutes mes lignes qui s'affichent.

    Ensuite, mon pbm avec strtok. Estr ce que je dois l'utiliser dans le while?
    ou apres?
    Quand tu m'as dit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       tps[i]= valeur_recup;
                 vit[i++]= valeur_recup;
    ou je trouve la valeur recuperee? Et comment dois-je faire si il y a une troisieme colonne de donnees?

    Si je mets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         pch = strtok (ligne, ";");
         printf("%s", pch);
    dans le boucle while, je ne recupere que la derniere ligne de mon fichier txt. idem si je le mets apres.

  11. #11
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    regarde le lien que j'ai mis dans la réponse précédente, ensuite tu cliques sur strtok et tu auras un bel exemple d'utilisation de strtok.

    Pour récupérer tes valeurs, tu vas devoir faire une conversion. Tu as des strings (composés de caractères) et tu veux du float.

    Je crois que atol est indiqué pour toi.

  12. #12
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 346
    Points : 439
    Points
    439
    Par défaut
    Bon je vais essayer de t'expliquer strtok sur un petit exemple :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char*argv[]) {
      char ex[] = "alain,paul;marcel toto";
      char *sep = ",; !";
      char *p;
      p = strtok(ex, sep);
      do {
        printf("%s \n",p);
        p = strtok(NULL, sep);
      }
      while (p != NULL);
      return (EXIT_SUCCESS);
    }
    Permet de segmenter le chaîne ex avec les séparateurs contenus dans sep
    à savoir ',' ';' '!'' ' '.

    Ensuite
    char *strtok (char *s1, char *s2) fragmente s1 selon les séparateurs donnés dans s2. Au premier appel lafonction modifie s1. Pour les autres appels on met NULL comme premier argument. A chaque appel de fonction retourne un pointeur sur un nouveau mot puis NULL quand il n'y en a plus.

  13. #13
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    ok. Merci pour atof et strtok.
    voila ou j'en suis
    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
     
     while(fgets(ligne, sizeof(ligne),file)!= NULL){
         i++;
         printf("%s", ligne);
         strcpy(line,ligne);
         p = strtok(line, sep);
         do{
           printf("%s\n",p);
           printf("%lf\n",atof(p));
           a[i]=atof(p);  
           printf("a[%d] vaut %lf\n",i, a[i]);
           p = strtok(NULL, sep);
         }
         while(p != NULL); 
    }
    En ecrivant cela, tous les elements d'une meme ligne prennent les memes indice. Mais si je fais l'implementation dans le boucle do, j'obtient plus rien du tout.
    Je pense bien que c'est le dernier pbm, car si pour chaque element, j'ai un indice different, je peux les regrouper dans des tableaux (multiples de 2, de trois, ...)

  14. #14
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 346
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par prorider
    ok. Merci pour atof et strtok.
    voila ou j'en suis
    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
     
     while(fgets(ligne, sizeof(ligne),file)!= NULL){
         i++;
         printf("%s", ligne);
         strcpy(line,ligne);
         p = strtok(line, sep);
         do{
           printf("%s\n",p);
           printf("%lf\n",atof(p));
           a[i]=atof(p);  
           printf("a[%d] vaut %lf\n",i, a[i]);
           p = strtok(NULL, sep);
         }
         while(p != NULL); 
    }
    En ecrivant cela, tous les elements d'une meme ligne prennent les memes indice. Mais si je fais l'implementation dans le boucle do, j'obtient plus rien du tout.
    Je ne sais pas à quoi te sert a[i] mais c'est normal que de cette façon tu
    écrases les premières valeurs.
    A mon avis il faut utiliser un tableau à deux dimensions où tu incrémentes
    ton compteur sur les colonnes dans le do-while et ton compteur sur les lignes à la fin de chaque boucle du while principal.

    Bon courage,

  15. #15
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Tel que c'était programmé précédemment, tu utilisais 2 tableaux.
    Quand je te parlais de tes pointeurs inutiles, c'était ceux qui faisaient référence au tableau, pas le tableau lui même.

    Par ailleurs, initialises tu i à 0 ?
    ton i++ doit se faire après avoir fait ton traitement sur la chaîne de caractère (après la boucle do-while) sinon i se retrouve directement à 1 et la première case de tes 2 tableaux sera vide.

    ta boucle do-while traite UNE ligne dans la quelle tu récupères 2 valeurs qui vont chacune dans un tableau différent.

    En fait je ne comprends pas l'intérêt de la boucle do-while

    Je pensais que pour chaque ligne tu n'avais qu'une valeur à rentrer par tableau.

  16. #16
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    Pour le coup tu tableau a double entre, j'y avais pense et c'est ok.
    Seulement le truc qui me depasse maintenant que je pensais que c'etait resolu, c'est que les intructions que je mets apres le while(fget...){....}
    ne passe plus. Pas meme un petit printf

    Pour ce qui est de ma boucle do while, elle decoupe la ligne, puis chaque morceau est attribue a une case du tableau a[][]. Em gros voila le programme, c'est plus simple

    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
     
    int main()
    {
     	double a[15][50]; 
     	double tps[15];
     	double autre[15];
     	double vit[15];
     	FILE *file; int  i; int j; int k;
     	char ligne[50];
     	char line[50];
     	char *p; char *sep = "; ";
     
     	file = fopen("nb.txt", "r");
     	i=0;j=0;
     	while(fgets(ligne, sizeof(ligne),file)!= NULL){
        		i++;
         		printf("%s", ligne);
         		strcpy(line,ligne);
         		p = strtok(line, sep);
         		do{
           			j++;
           			printf("%s\n",p);
           			printf("%lf\n",atof(p));
           			a[i][j]=atof(p);  \\attribut un morceau a une case du tableau
           			printf("a[%d][%d] vaut %lf\n",i,j,a[i][j]);  \\verif
           			p = strtok(NULL, sep);
         		}
         		while(p != NULL);
    	}
     
     	fclose(file);
     
    	printf("ok");  \\verif
     	for(k=0;k=i-1;k++){
    		tps[k]=a[k+1][4*k+1];\\les valeurs correpondant au tps sont les mutltiples de 4 modulo 1 de la deuxieme entre a [][]
            	autre[k]=a[k+1][4*k+2];\\idem +2
            	vit[k]=a[k+1][4*k+3];
    	}
     	printf("%lf, %lf, %lf", tps[1], vit[1], autre[1]);  \\verif
     	return ; 
    }
    seulemt, comme dit, les instructions ne passent plus apres la parenthese qui se trouve avant fclose

  17. #17
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 346
    Points : 439
    Points
    439
    Par défaut
    A mon avis un bon petit segfault des familles car :
    tu dois remettre j = 0 à la sortie du do-while où plutot avant le j n'a pas à être initialisé avant le while. Sinon tu vas te ballader
    n'importe où dans la mémoire => segfault.
    A première vue je ne vois pas d'autres grosses erreurs.

  18. #18
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    en mettant j=0 avant le while(fgetc..) et en remettant j=0 apres le do .. while le resultat n'est toujours pas bon.

  19. #19
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    J'ai l'impression d'être muet.

    Tu fais ton i ++ trop tôt !
    le premièr indice de tableau que tu utilises c'est 1, or il faut commencer à 0

    fais ton i++ en fin de boucle, pareil pour j++

  20. #20
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    ok
    je viens de le faire. Mes tableaux commencent a 0, mais je ne peux toujours rien faire a pres le while (fgets...){}

    merci bcp pour votre aide a tous les deux, et bonne soiree
    Sans doute a demain (dsl)

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

Discussions similaires

  1. [FSO][VBA]Lecture de fichier texte actif
    Par Marco_SAP dans le forum Access
    Réponses: 10
    Dernier message: 12/12/2006, 15h46
  2. Réponses: 2
    Dernier message: 08/11/2006, 20h57
  3. [C#]Lecture gros fichier texte
    Par kekesilo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/05/2006, 13h58
  4. Lecture d´un fichier texte .
    Par pilouface dans le forum C
    Réponses: 5
    Dernier message: 20/01/2006, 23h48
  5. [AS2] Lecture Ecriture Fichier Texte
    Par cpr0 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 13/09/2005, 11h22

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