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 avec sscanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Par défaut lire avec sscanf
    bonjour a tous,
    mon probleme est le suivant j'ecris dans un fichier et je voudrais recuperer les donnees dans le fichier en faisant une lecture ligne par ligne et en enregistrant chaque composant de la ligne dans un champ. mon code est le 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
     
        //declaration de ma structure
       typdef struct stligne stligne;
       struct stligne{
          int id;
          char ch1[50];
          char ch2[50];
          char ch3[50];
       };
    // fonction ecrire ligne
     
    int ecrireligne(stligne *ligne)
    {
       FILE *pF = NULL;
       if ((pF = fopen("fichier.csv", "a"))){ 
                fprintf(pF, "%4d, %s, %s, %s \n", 
                               &ligne->id, ligne->ch1, ligne->ch2, ligne->ch3);
                fclose(pF);
                return 0;
       } else return 1;
    }
     
    void lireligne(){
       char line[1024];
       stLigne ligne;
       FILE *pF = NULL;
       if ((pF = fopen "fichier.csv", "r"))){
             while(feof(pF) == 0){
                fgets(line, sizeof (ligne), pF);
                sscanf(line,"%4d %s %s %s", 
                          &ligne.id, ligne.ch1, ligne.ch2, ligne.ch3);
                printf("\n %4d %s %s %s", ligne.id, ligne.ch1, ligne.ch2, ligne.ch3);
             }
             fclose(pF);
       }
    }
    à l'ouverture du fichier il contient toute les infos de la struct mais á la lecture je n'obtient pas le dernier champ ligne.ch3 pour toutes les lignes du fichier.
    quelqu'un pourrait me dire pourquoi??
    merci

  2. #2
    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
    Par défaut
    Ta boucle de lecture est fausee :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       if ((pF = fopen "fichier.csv", "r"))){
             while(fgets(line, sizeof (ligne), pF) != NULL){
     
                sscanf(line,"%4d %s %s %s", 
                          &ligne.id, ligne.ch1, ligne.ch2, ligne.ch3);
                printf("\n %4d %s %s %s", ligne.id, ligne.ch1, ligne.ch2, ligne.ch3);
             }
             fclose(pF);
       }
    feof ne fait pas ce que tu crois .
    "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

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Par défaut
    c'est vrai pour fgets, mais mon probleme demeure car pour chaque ligne je ne recois que ligne.id, ligne.ch1, ligne.ch2 et pas ligne.ch3

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Essaie de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fgets(line, sizeof (ligne), pF)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fgets(line, sizeof (line), pF)

  5. #5
    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
    Par défaut
    Bien vu, mais je ne suis pas sûr que ce soit ça.
    "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

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par tcharles
    c'est vrai pour fgets, mais mon probleme demeure car pour chaque ligne je ne recois que ligne.id, ligne.ch1, ligne.ch2 et pas ligne.ch3
    Est-ce qu'on peut voir un petit fichier que tu utilises pour ce programme et qui pose un problème ?

    Jc

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Par défaut
    fgets je le fais comme vous le dites c'est juste une erreur de frappe de ma part.
    merci pour vos suggestions mais je pense que le pb est plutot ailleur dans mon format, en fait mon fichier (csv file ) ressemble a ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1, toto1, tata1
    2, toto2, tata2
    3, toto3, tata3
    ce qui fait que le compilateur prend pour entier '1' , 1ere chaine ',' et pour 3eme chaine 'toto1,' ainsi je ne peux avoir tata1.
    je pense que j'aurais besoin soit d'un bon format pour eliminer les virgules, soit d'un decoupage a part de la chaine.
    vos idees sont les bienvenues

  8. #8
    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
    Par défaut
    Utilise strtok ou sa version safe s_strtok je crois, c'est en général le bon plan.
    "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

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Je sais pas si c'est aussi une erreur de frappe, mais voila comment il faudrait que le sscanf soit ecrit (avec les ,):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sscanf(line,"%4d, %s, %s, %s", 
                          &ligne.id, ligne.ch1, ligne.ch2, ligne.ch3);

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Je crois que j'ai compris le pb : un %s dans un sscanf extrait tous les caracteres jusqu'a trouver un blanc.

    Donc quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(ligne,"%d, %s, %s",&id, ch1, ch2 );
    pour ligne="1, toto, titi"
    il trouve id = 1, ch1 ="toto," et il ne trouve rien pour ch2, puisque la fin du pattern (qui doit commencer par ", ") ne correspond pas.

    Il faudrait ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(ligne,"%d, %s %s",&id, ch1, ch2 );
    et éliminer les , sur ch1, ou suivre la proposition de fearyourself

  11. #11
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Ou alors, lit ce tutoriel et essaie d'utiliser les expressions régulières.

    J'ai essayé chez moi:
    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
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        FILE *pF;
        char ligne[128];
        char ch1[16];
        char ch2[16];
        int id;
    
        if ( (pF = fopen("test.txt", "r"))!=NULL) {
            while(fgets(ligne, sizeof (ligne), pF) != NULL){
                printf("-> %s",ligne);
                sscanf(ligne,"%d, %[^,], %s",&id, ch1, ch2 );
                printf("--> %d '%s' '%s'\n", id, ch1, ch2 );
            }
            fclose(pF);
        }
    
        return EXIT_SUCCESS;
    }
    Et j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -> 1, toto1, tata1
    --> 1 'toto1' 'tata1'
    -> 2, toto2, tata2
    --> 2 'toto2' 'tata2'
    -> 3, toto3, tata3
    --> 3 'toto3' 'tata3'

Discussions similaires

  1. Lire une ligne de caractères et de doubles avec sscanf
    Par colinou dans le forum Débuter
    Réponses: 4
    Dernier message: 16/03/2008, 20h46
  2. Lire avec le port serie (buffer, count, offset)
    Par Bossju dans le forum VB.NET
    Réponses: 3
    Dernier message: 09/02/2007, 17h58
  3. Problème avec sscanf
    Par Goundy dans le forum C
    Réponses: 13
    Dernier message: 07/10/2006, 03h56
  4. [VB.NET2.0] lire avec Serialport
    Par Emcy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 21/06/2006, 11h33
  5. Découpage buffer avec sscanf
    Par sorry60 dans le forum C
    Réponses: 4
    Dernier message: 07/12/2005, 17h41

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