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 dans un fichier et conversion avec std::istringstream


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Janvier 2013
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Par d�faut Lecture dans un fichier et conversion avec std::istringstream
    Bonjour,

    J'essaie de lire le contenu d'un fichier texte dont le contenu ressemble � ceci :
    Pour chaque ligne je voudrais r�cup�rer les deux valeurs dans deux variables de type int.
    J'y parviens en utilisant ce 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
    #include <iostream>
    #include <fstream>
    #include <sstream>
    using namespace std;
    int main(int argc, char **argv) {
        string nomFichier = "test1.txt";
        ifstream fichier(nomFichier.c_str(), ios::in);
        string ligne;
        int first, second; 
     
        while(getline(fichier, ligne)) {
            cout << ligne << "\t=>\t";
            istringstream ss(ligne);
            ss >> first >> second;
            cout << first << "\t" << second << endl;
            ss.str().clear();
        }
     
        fichier.close();
        return 0;
    }
    Le seul "probl�me" est que je d�clare un istringstream � chaque it�ration, ce qui ne me semble pas tr�s propre ni optimis�.
    Pouvez-vous m'indiquer comment modifier ce code pour ne cr�er un qu'un seul istringstream et le r�initialiser avec la nouvelle ligne � chaque passage dans la boucle ?

    Je pr�cise que je suis d�butant en C++ et que j'ai trouv� un message, ici, qui semble r�pondre � ma question, mais je n'ai pas r�ussi � mettre en oeuvre la solution indiqu�e.

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    istringstream ss;
    while(getline(fichier, ligne)) {
        cout << ligne << "\t=>\t";
        ss.str(ligne);
        if (!(ss >> first >> second)) {
            //erreur
        }
        cout << first << "\t" << second << endl;
    }
    Mais sinon, tu peux tous lire en une traite. Les flux consid�rent les espaces, sauts de ligne et tabulations comme un seul caract�re d'espacement.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    while(fichier >> first >> second) {
        cout << first << "\t" << second << endl;
    }

  3. #3
    Membre averti
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Janvier 2013
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Par d�faut
    En appliquant ta premi�re proposition je ne parviens pas tout � fait � faire ce que je veux. Avec ce code ce sont toujours les donn�es de la premi�re ligne qui sont affich�es.
    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
    #include <iostream>
    #include <fstream>
    #include <sstream>
    using namespace std;
    int main(int argc, char **argv) {
        string nomFichier = "test1.txt";
        ifstream fichier(nomFichier.c_str(), ios::in);
        string ligne;
        int first, second; 
     
        istringstream ss;
        while(getline(fichier, ligne)) {
            cout << ligne << "\t=>\t";
            ss.str(ligne);
            if (!(ss >> first >> second)) {/*erreur*/}
            cout << first << "\t" << second << endl;
            ss.str().clear();
        }        
        fichier.close();
        return 0;
    }
    La sortie donne ceci, que je mette ou pas la ligne 17 :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    1 45    =>      1       45
    21 2    =>      1       45
    3 7     =>      1       45
    En revanche la deuxi�me solution fonctionne tr�s bien. Par contre je ne suis pas certain de bien comprendre pourquoi
    J'ai un peu de mal � voir dans quel ordre se fait l'�valuation de la ligne while(fichier >> first >> second), pourquoi les lignes sont bien lues une � une et pas autrement, etc.
    Si tu peux me donner quelques explications je suis preneur.

    Merci pour tes r�ponses.

  4. #4
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    Oups, pour le premier exemple j'ai oubli� de mettre ss.clear(); avant le if. Lorsque les 2 nombre sont lus, le flux passe �ventuellement en oef s'il n'y a plus rien sur la ligne. Il faut donc le remettre dans un �tat valide (ios::clear).
    Le clear() de ss.str().clear(); fait partit de std::string et ne fait strictement rien ici. str() retourne un std::string et clear() la vide...

    Citation Envoy� par Eldergrim Voir le message
    En revanche la deuxi�me solution fonctionne tr�s bien. Par contre je ne suis pas certain de bien comprendre pourquoi
    J'ai un peu de mal � voir dans quel ordre se fait l'�valuation de la ligne while(fichier >> first >> second), pourquoi les lignes sont bien lues une � une et pas autrement, etc.
    Si tu peux me donner quelques explications je suis preneur.
    L��valuation se fait dans le sens de la lecture first puis second puis on recommence.
    Que �a lise ligne pas ligne n'est qu'une cons�quence du format utilis�. Les nombres pourraient �tre tous sur une ligne ou un par ligne le r�sultat sera le m�me.

    Quand une type scalaire (char fait exception) est lu, le flux va ignorer tous les espaces blancs. Ces caract�res sont grosso modo d�termin�s par isspace.
    Ensuite, par exemple pour un int, il va r�cup�rer tous les caract�res qui suivent et transformer �a en entier.
    Si une erreur survient pendant la lecture comme un caract�re invalide (comprendre diff�rent d'un chiffre) ou la fin du fichier, alors le flux change d'�tat et la boucle s'arr�te.
    Faire if(fichier >> variable); et l'�quivalent de fichier >> variable; if (fichier.good());.

  5. #5
    Membre averti
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Janvier 2013
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Par d�faut
    La premi�re solution fonctionne effectivement mieux avec le ss.clear().

    Pour la deuxi�me m�thode, je vais faire quelques tests pour mieux comprendre le fonctionnement. Je n'ai pas l'habitude d'utiliser des flux, et encore moins en C++. Il faut que je pratique !

    Merci pour tes explications.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 1
    Dernier message: 16/03/2010, 09h58
  2. Lecture dans un fichier excel avec C#
    Par randriamanana dans le forum ASP.NET
    R�ponses: 3
    Dernier message: 24/10/2007, 11h20
  3. Lecture dans un fichier avec lseek
    Par Maria1505 dans le forum Linux
    R�ponses: 8
    Dernier message: 24/02/2007, 12h29
  4. R�ponses: 20
    Dernier message: 25/09/2005, 15h07
  5. R�ponses: 12
    Dernier message: 14/06/2004, 13h06

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