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 :

Ecrire/Lire fichier texte


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut Ecrire/Lire fichier texte
    Bonjour,

    Je sais lire ou écrire un fichier texte mais comment on récpuére les données séparées par un espace ou "," ou ";". Peut les récuprer une par une.
    Mon souhait serait de les récupérer une par une dans une liste std::vector

    Merci de votre future aide.

  2. #2
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Y a t-il un autre moyen? Car j'ai voulu installé boost et utiliser tokeniser mais ça ne marche pas

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    La fonction getline devrait te venir en aide.

    On utilise souvent la fonction sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    std::ifstream ifs("monfichier.txt");
    std::string str;
    while (std::getline(ifs,str))
    {
        /*...*/
    }
    mais il est possible de lui fournir un troisième paramètre qui servira de délimiteur.

    Ainsi, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::ifstream ifs("monfichier.txt")
    std::string str;
    std::vector<std::string> tab;
    while (std::getline(ifs,str,','))
    {
        tab.push_back(str);
    }
    aura pour effet, non seulement de terminer la chaîne à chaque "\n" (comportement "normal"), mais la terminera également à chaque virgule rencontrée.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Bien joué Koala !
    Celà dit, Boost.Tokenizer qui ne marche pas, j'y crois pas une seconde. Désolé.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par poukill Voir le message
    Bien joué Koala !
    Hé oui, que veux tu pour moi, les solutions les plus simples ont toujours été... les moins compliquées
    Celà dit, Boost.Tokenizer qui ne marche pas, j'y crois pas une seconde. Désolé.
    Il y a, en effet très peu de chances que Boost.tokenizer ne fonctionne pas (d'autant plus qu'il est très vague que le sujet)...

    J'aurais presque tendance à croire que notre ami n'a pas trouvé le moyen de les faire fonctionner... et qu'il en rejette naturellement la faute sur la bibliothèque

    Mais bon, à décharge, il faut avouer que l'installation et l'utilisation de boost est parfois assez ardue à comprendre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Merci.

    Je vais tester tout cela cet après midi. Je vous tiendrai au courant.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Cette ligne de code a un problème:

    std::ifstream ifs("monfichier.txt")


    on me dit que ifs est redéfini, initialisation multiple

    Pourrait-on m'aider?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    C'est bon, j'avais mis 2 fois la même ligne d'initialisation. Le con!

  10. #10
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Ca veut dire que tu l'as déjà défini avant... L'erreur est claire, non?
    Choisis un autre nom de variable que ifs...

  11. #11
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par toutounesan Voir le message
    Le con!
    C'est pas moi qui le dit...

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Le vecteur tab ne récupère rien du fichier. Pourtant j'ai bien regardé que j'avais écrit dans le fichier?

    D'ailleurs comment fait-on quand il y a un mix entre entier et caractères?

    Merci d'avance

  13. #13
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::ifstream ifs("monfichier.txt");
    std::string str;
    std::vector<std::string> tab;
    while (std::getline(ifs,str,';'))
    {
    	tab.push_back(str);
    }
    Ce code a été testé sur mon PC... C'est OK
    Par contre, il manque un point virgule dans ton code...

    Autre chose, std::getline n'est pas sensible au \n chez moi...

    Ainsi avec un fichier texte :
    2;A;4
    E;6;B
    Tab vaut : [2, A, 4 E, 6, B]

    Conclusion, met un ";" à la fin des lignes

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Je ne récupère rien dans mon vecteur?!!

    et je n'arrive pas à écrire du texte...

  15. #15
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Je me rend compte que j'ai dit une bêtise... Le '\n' n'est pas pris en compte lorsque l'on précise le caractère de séparation.
    voici donc un code qui devrait te permettre de vérifier le fichier ci-joint:
    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
    37
    38
    #include <vector>
    #include <fstream>
    #include <string>
    #include <iostream>
    #include <stdexcept>
    using namespace std;
    void Read(const string& name, vector<string>& tab)
    {
        try
        {
            ifstream ifs(name.c_str());
            // on s'assure que le fichier est trouvé ;) 
            if(!ifs)
                throw runtime_error("impossible d'ouvrir le fichier");
            string str;
            while(getline(ifs,str,','))
            {
                /* le '\n' qui nous ennuiera, s'il y en a un, 
                 * sera le premier caractère de la chaine, on le retire ;) */
                if(str[0]=='\n')
                    str=str.substr(1,str.size()-1);
                tab.push_back(str);
            }
        }
        catch(exception &e)
        {
            cout<<e.what();
        }
    }
    int main()
    {
        vector<string> recup;
        Read("essai.txt",recup);
        cout<<"taille du tableau :"<<recup.size()<<endl;
        for(size_t i=0;i<recup.size();i++)
            cout<<"info "<<i<<":"<<recup[i]<<endl;
        return 0;
    }
    Et pour répondre à ta question concernant les différents types, si ton fichier a une structure bien définie (par exemple nom, prenom, telephone où nom et prenom sont des chaines et telephone est un entier)

    tu peux prévoir un code basé sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    std::ifstream ifs("fichier.txt")
     
    std::string nom;
    std::string prenom;
    size_t telephone;
    while(std::getline(ifs,nom,',')
    {
        std::getline(ifs,prenom,',');
        ifs>>telephone;
    }
    ou, ca peut prendre la forme d'un
    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
     
    std::ifstream ifs("fichier.txt");
    std::string nom;
    std::string prenom;
    size_t telephone;
    std::string temp;
    // on lit toute la ligne dans une chaine temporaire
    while(std::getline(ifs,temp))
    {
        //on passe dans un stringstream
        std::stringstream ss;
        ss<<temp;
        //et on récupère les données à la suite ;)
        ss>>nom>>prenom>>telephone;
    }
    Fichiers attachés Fichiers attachés
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #16
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par poukill Voir le message
    Par contre, il manque un point virgule dans ton code...
    Ah oui... j'ai été un peu vite pour l'écrire, et je ne l'ai pas testé ... je le corrige de suite
    Autre chose, std::getline n'est pas sensible au \n chez moi...
    Ca aussi, je m'en suis rendu compte
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Bonjour,

    Je n'arrive pas du tout à rcupérer les données du fichier:

    Je n'arrive pas non plus à écrire du texte.

    Merci de m'aider, j'en ai vraiment besoin:
    je veux retravailler car j'ai eu un très grave accident de voiture. J'ai beaucoup récupéré.Je suis en stage avant de retravailler, j'espère.

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    voici mon code pour tester la lecture:

    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
     
    std::ofstream file1( "C://test.txt");
    	int i=12;
    	file1<<i;
     
     std::ifstream fichier( "C://test.txt" );
     
        if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
        {
            std::string ligne; // variable contenant chaque ligne lue
     
            // cette boucle s'arrête dès qu'une erreur de lecture survient
            while ( std::getline( fichier, ligne ) )
            {
                // afficher la ligne à l'écran
                std::cout << ligne << std::endl;
            }
        }
    Merci de penser à la balise CODE koala01

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Je crois que j'ai oublié de fermer le fichier!

  20. #20
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ofstream file1( "C://test.txt");
    Attention !
    Si tu es sur de l'endroit (à la racine du disque dur C), alors c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ofstream file1( "C:/test.txt");
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ofstream file1( "C:\\test.txt");
    Si ton test.txt se trouve dans le même répertoire que ton exécutable, un simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ofstream file1( "test.txt");
    suffit

Discussions similaires

  1. java : lire fichier texte application web (war)
    Par drob38 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 08/07/2009, 00h31
  2. [VB.NET 2.0] lire fichier text
    Par Emcy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/12/2006, 09h45
  3. Lire fichier texte
    Par kinouseb dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 08/11/2006, 18h01
  4. Lire fichier texte en respectant la police, la forme
    Par loupin dans le forum Langage
    Réponses: 2
    Dernier message: 10/07/2006, 23h49
  5. Lire fichier Texte
    Par rprom1 dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 15/03/2006, 17h36

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