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 :

Simplification de la lecture d'un fichier texte


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut Simplification de la lecture d'un fichier texte
    Bjr à tous,

    Je dois lire un fichier texte dont les lignes sont au format suivant :

    chaine_sans_espace 0x10 1 "chaine quotée avec des espaces"<CR><LF>

    Actuellement, je charge la ligne dans un char buffer[], que je parse avec un sscanf.

    Le problème est que sscanf traite le charatère espace (' ') comme un séparateur de champ. Cela me convient pour les 3 premieres données de la ligne, mais pas pour la dernière qui elle est quotée et peut contenir des caractères espace (' ').

    Heureusement pour moi, la chaîne problématique se trouve en fin de ligne.

    Je parcours donc le buffer[] de lecture de fichier avec un pointeur en comptant le nombre d'espace afin de me positionner au bon endroit càd un cran après le nième (3 dans l'exemple) caractère espace ' ' puis strcpy+strlen pour recopier la donnée dans la variable destination.

    Mis à part les warnings du compilateur sur la dangerosité de l"utilisation de sscanf, strcpy et srlen, je trouve inélégante une telle méthode de récupération de la donnée quotée.

    Il y a-t'il une solution plus appropriée à ce genre de problème ?

    N.B. Ce n'est pas mon cas, mais on remarquera que le problème se corse si le champ quoté n'est pas en dernière position sur la ligne.

    Amicalement, à tous pour avoir prété attention à ce message.

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    je te conseille d'utiliser fgets qui semble plus convenir a ton besoin, ou bien fread
    avec fgets tu récupure la ligne entiere que tu peux analyser ensuite tranquilement.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #3
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Il est possible d'utiliser avec les fonctions de la famille xscanf() des formateurs une peu plus évolués que "%s", notamment "%[^\n]" qui permet de prendre tous les caractères y compris les espaces et tabulations jusqu'au retour à la ligne.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Merci jabbounet pour ta réponse,
    c'est effectivement ce que je fait :

    je clarifie donc ma procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pFile= fopen( my_file, "r");
    if( NULL!= fgets(buffer, file_size, pFile)){
    if( 3= sscanf( buffer, "%s%x%i", struct1.pStr1, struct1.myint1, struct1.myint2)){
           // à ce moment j'initialise un pointeur, saute les 3 premiers "espaces",
           // puis copie la fin du "buffer" dans la variable destination
           ...
    }}
    Merci gl pour ta réponse, je file voir ça de plus près, sûr que ça le fera ...
    Merci aussi pour ta patience car je me rends compte à postériori que mon problème n'était exposé de façon ultra explicite !!! Tu ne t'étais pourtant pas trompé

  5. #5
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Pourquoi ne pas utiliser fscanf() directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fscanf(fd, "%s %x %d %[^\n] %*[\n]", s1, &v1, &v2, s2);
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Merci ssmario2,

    Réponse à ta question, j'étais juste parti sur un fgets tout bête (donc buffer et parse ultérieur), pas forcement la plus maligne des choses si j'ai bien compris ta suggestion ...

    Je sens de + en + que ça va le faire

    Merci à tous, pour vos suggestions

    Si je suis un fana du moins j'en tape mieux c'est, les règles de l'art passent néanmoins avant tout, et vous m'y amenez tout droit !!!

  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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Pourquoi ne pas utiliser fscanf() directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fscanf(fd, "%s %x %d %[^\n] %*[\n]", s1, &v1, &v2, s2);
    En tout cas pas de cette manière. Ici tu ne gères pas les tailles des chaînes et tu risques un débordement de buffer.
    Je t'invite à lire Scanf démystifiée pour une utilisation plus correcte de scanf et assimilé.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Bonsoir,
    Et merci à tout les deux,

    Comme je me suis mis en tête de gérer tout mes struct, (string y compris) à grand coup de malloc, j'évalue toujours la taille maximum d'une chaîne avant de l'affecter.
    Ca donne des situations qui me paraissaient cocasses au départ, genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* str= malloc( 1+ "la taille de mon fichier texte");
    mais au moins avec ça je suis paré contre les dépassements de buffers. (pas contre les "not enough memory" ).

    Comme je suis en plein chantier de reconstruction des structures de données, j'ai pas eu l"occasion de valider par la preuve la solution proposée. Cependant la documentation suggérée parle d'elle-même, et si ca ne fonctionne pas ça ne sera que de MA faute ... Je réouvrirai le cas échéant ce sujet que je considères comme résolu.

    Encore merci à tous les deux.

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

Discussions similaires

  1. Lecture d'un fichier texte dans un projet TOMCAT
    Par brice_nice dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 03/07/2005, 15h04
  2. lecture d'un fichier texte
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 22/06/2005, 11h50
  3. [C#] Lecture d'un fichier texte (farfelu)
    Par choas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/04/2005, 14h33
  4. Lecture d'un fichier Texte
    Par jcharles dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/10/2004, 14h58
  5. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05

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