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 :

Bonne pratique lecture de fichier texte


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut Bonne pratique lecture de fichier texte
    Bonjour à tous !

    Je veux lire un fichier texte de la manière la plus élégamment cépluplussienne, tout en évitant des memcpy superflus.

    En gros, j'aimerais une boucle qui à chaque tour, renseigne une string avec la ligne suivante lue dans le fichier.

    Tout ce que j'ai trouvé c'est :
    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
     
    void work_with_string ( const string & s ) ;
     
    void read_file ( string filename )
        {
        ifstream file( filename ) ;
        if (!file.good()) return ;
        while (!file.eof())
            {
            char sline [100] ;
            file.getline( sline,sizeof( sline )) ;
            string line = sline ; // <------  memcpy !!!!
            work_with_string( line ) ;
            }
        }
    Et en plus, je suis obligé de connaître un majorant de la longueur des lignes !

    Et si je fais file >> line ; j'obtiens des chaînes découpées au niveau des espaces (et non des EOL).

    D'où ma question : il y a-t-il un moyen propre, et néanmoins sans memcpy, de lire les lignes d'un fichier texte dans des string ?

    Merci d'avance !
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ceci lira directement une ligne vers une string.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string line;
    std::getline(file, line);
    En jouant sur le constructeur de string(), il y a probablement moyen d'initialiser sa capacité de départ pour éviter des realloc ou équivalent (qui causeraient un memcpy) pendant la lecture de la ligne.
    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.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Avec std::getline, tu peux directement utiliser un std::string.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::getline(file, line);
    Pour éviter trop de réallocation, il serait plus judicieux de le déclarer en dehors de la boucle, ainsi il ne sera pas recréé à chaque itération, mais juste réalloué au besoin.

    Remarque : ta logique que lecture utilisant while (!file.eof()) est incorrecte, je t'invite à consulter ce sujet de la FAQ :
    Comment détecter la fin de fichier lors de la lecture ?

  4. #4
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Argl !
    j'aurais dû consulter les FAQ !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string line;
    while ( getline( file, line ) )
    {
    C'est la classe !

    Merci !
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/11/2006, 20h57
  2. [C#]Lecture gros fichier texte
    Par kekesilo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/05/2006, 13h58
  3. Lecture d´un fichier texte .
    Par pilouface dans le forum C
    Réponses: 5
    Dernier message: 20/01/2006, 23h48
  4. [AS2] Lecture Ecriture Fichier Texte
    Par cpr0 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 13/09/2005, 11h22
  5. lecture de fichier texte
    Par prorider dans le forum C
    Réponses: 36
    Dernier message: 08/09/2004, 20h55

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