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 :

lire un fichier texte


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Par défaut lire un fichier texte
    bonsoir,
    j'ai juste un peutit probleme avec mon code en C.
    j'arrive a lire une fichier txt ligne par ligne OK
    dans le fichier txt ex: le contenu est : 12 nom adresse
    je n'arrive pas mettre chaque mots dans une variable, vue que les mots sont separer par tabulation.

    fscanf (fich, "%[^]%[^]%[^]", &tab[i][j], &tab [j][j+1], &tab [k][j+2]);

    sur chauqe tab il copier tout. !!
    merci pour ton aide

  2. #2
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Citation Envoyé par Sami_lucas
    bonsoir,
    j'ai juste un peutit probleme avec mon code en C.
    j'arrive a lire une fichier txt ligne par ligne OK
    dans le fichier txt ex: le contenu est : 12 nom adresse
    je n'arrive pas mettre chaque mots dans une variable, vue que les mots sont separer par tabulation.

    fscanf (fich, "%[^]%[^]%[^]", &tab[i][j], &tab [j][j+1], &tab [k][j+2]);

    sur chauqe tab il copier tout. !!
    merci pour ton aide
    C'est quoi ce formatage bizarre ?
    '%s' suffit pour des champs séparés par un caractère blanc (type espace, tabulation, ...)
    Il faut de plus faire attention a la taille des chaînes de caratères. Vérifier le retour de la fonction.
    Et quand je vois des '&' devant les variables, je crains le pire....
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Par défaut
    ok pour le formatage, je le met avec %s et l'enleve le'&' mais le n'arrive pas a voir ci il copier juste le premier mots dans la table1 , 2ème a la tab2 et 3è a tab3.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    Par défaut
    scanf("%s") est un bug.

    À moins d'être un expert de scanf(), je conseillerais de lire ligne par ligne et d'analyser ensuite...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Citation Envoyé par Médinoc
    scanf("%s") est un bug.

    À moins d'être un expert de scanf(), je conseillerais de lire ligne par ligne et d'analyser ensuite...
    Il aura les mêmes problèmes en analysant ensuite les champs, dont il ne connaîtra pas la taille.
    L'interet pour lui d'utiliser fgets est qu'il peut avoir moins de problèmes à gerer les '\n' dans le fichier (enfin sauf si les champs sont plus longs que la taille qu'il peut estimer pour une ligne....). Mais il faudra quand meme faire attention aux tailles des buffers avec sscanf.
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Par défaut
    ça ne marche pas avec %s
    voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (!feof (fich))
    {
       fscanf (fich, "%s %s %s", tab [i], tab [j], tab [k] );
       printf("%s\n", tab[i]);	     	  
       j++;
       i++;
       k++;
    }
    donc si je veux qui affiche la contenu du tab [i] il imprime la dernier mot.

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Sami_lucas
    ça ne marche pas avec %s
    voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (!feof (fich))
    {
       fscanf (fich, "%s %s %s", tab [i], tab [j], tab [k] );
       printf("%s\n", tab[i]);	     	  
       j++;
       i++;
       k++;
    }
    donc si je veux qui affiche la contenu du tab [i] il imprime la dernier mot.
    Deux-trois remarques:
    * feof() ne fonctionne pas comme ca : http://c.developpez.com/faq/c/?page=...RS_fin_fichier
    * tu n'as aucune verification sur la taille des chaines de caracteres lues dans ce code. Si le mot est plus long que la taille reserve ca ne fonctionne pas correctement.
    * Tu ne verfies pas le nombre de conversion correctement effectuees par fscanf(), si il y a un probleme, tu ne le detectes donc pas.


    Pourquoi veux tu absolument utiliser fscanf() ? Une lecture ligne par ligne et une analyse "a la main" sont plus simple a mettre en place.
    En outre si tu veux une aide pertinente, il faut au moins fournir:
    * la declaraton de tab
    * la description precise du format du fichier

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Par défaut
    voici 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 100
     
    int main(int argc, char *argv[]){
        char nomFich [MAX]; 
        char tab [MAX];
     
        int i, j, k;
     
        i = 0;
        j = 0;
        k = 0;
     
    FILE * fich;
    fich = fopen ("e.txt", "r");
     	if(fich != NULL){
     
       	  while (!feof (fich)){
     	     	  fscanf (fich, "%s %s %s", tab[i],tab[j],tab[k]);
      	     	  printf("%s %s %s\n", tab[i], tab[j], tab[k]);
       	  }
     
            }
      system("PAUSE");	
      return 0;
    }

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Sami_lucas
    voici 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 100
     
    int main(int argc, char *argv[]){
        char nomFich [MAX]; 
        char tab [MAX];
     
        int i, j, k;
     
        i = 0;
        j = 0;
        k = 0;
     
    FILE * fich;
    fich = fopen ("e.txt", "r");
     	if(fich != NULL){
     
       	  while (!feof (fich)){
     	     	  fscanf (fich, "%s %s %s", tab[i],tab[j],tab[k]);
      	     	  printf("%s %s %s\n", tab[i], tab[j], tab[k]);
       	  }
     
            }
      system("PAUSE");	
      return 0;
    }
    Alors, en plus de problemes deja signales :
    * tab[i], tab[j] et tab[k] ne sont pas des varaibles correctes pour contenir des chaines de caracteres (en effet, ce sont des char et non des tableaux de char).
    * i, j et k etant egaux, tab[i], tab[j] et tab[k] le sont egalement, du coup tu perds forcement deux des trois lectures.
    * argc et argv ne sont pas utiliser, autant utiliser int main(void)
    * nomFich n'est pas utilise.

    Au passage, voici que me donne mon compilateur sur ce code ci:

    main.c: In function `main':
    main.c:20: warning: format argument is not a pointer (arg 3)
    main.c:20: warning: format argument is not a pointer (arg 4)
    main.c:20: warning: format argument is not a pointer (arg 5)
    main.c:21: warning: format argument is not a pointer (arg 2)
    main.c:21: warning: format argument is not a pointer (arg 3)
    main.c:21: warning: format argument is not a pointer (arg 4)
    main.c:6: warning: unused variable `nomFich'
    main.c: At top level:
    main.c:5: warning: unused parameter 'argc'
    main.c:5: warning: unused parameter 'argv'

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 943
    Par défaut
    Si les champs sont séparés par une tabulation, une simple lecture avec fgets comme suggéré par Médinoc suivi d'un strtok par exemple devrait faire l'affaire.
    "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

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Par défaut
    merci, j'ai compris, ça marche maintenant, il fallait juste ne pas utiliser les int (i, j, k) mais directement les tableaux.
    merci pour votre aide.

  12. #12
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Sami_lucas
    merci, j'ai compris, ça marche maintenant, il fallait juste ne pas utiliser les int (i, j, k) mais directement les tableaux.
    Comme indeique precedemment, il n'y avait pas que ca comme probleme.

    Et je rajouterais a la liste que le fichier est ouvert mais jamais ferme.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/12/2005, 16h57
  2. [Applet] lire un fichier texte
    Par lebesnec dans le forum Applets
    Réponses: 2
    Dernier message: 07/07/2005, 11h09
  3. Réponses: 1
    Dernier message: 24/11/2004, 17h54
  4. [Fichier] Lire un fichier texte long
    Par _Eric_ dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 18/08/2004, 16h22
  5. Réponses: 2
    Dernier message: 26/05/2004, 18h53

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