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 de plusieurs fichiers texte


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 110
    Par défaut Lecture de plusieurs fichiers texte
    Bonjour,

    je suis novice en c++ et j´aimerais ouvrir en mode lecture plusieurs fichiers text. En fait j´aimerais lire sucessivement chaque fichier texte. les fichiers sont definis de la maniere suivante: data_0, data_1, data_2 et data_3.

    Helas mon code ne marche pas.
    pourriez-vous, s´il vous plaît corriger mon programme ?

    Merci !!

    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
     
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    using namespace std;
     
    int main()
    {
        string line, myline;
        string filename;
        ostringstream ss;
        filename = "data_";
     
    for(unsigned int i=0;i<4;i++)
    {
       ss << filename << i;
       std::ifstream file;
       file.open(ss.str().c_str());
     
       if(file!=NULL)
       {
           while(getline(file,line))
           {
               myline += line;
               cout << myline << endl;
           }
       }
       else
       {
         cout << "Impossible de lire le fichier texte" << endl;
     
       }
       file.close();
    }
    return 0;
    }

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Tu n'as pas beaucoup cherché
    Lorsque quelque chose ne marche pas on fait des affichages pour essayer de voir ce qui ne va pas.

    Tu aurais pu écrire ce programme qui est une version simplifiée du tiens:
    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
    // g++ -Wall -Wextra -pedantic main.cpp && a.out
     
    #include <iostream>
    #include <string>
    #include <sstream>
     
    int main()
    {
    	std::string filebase_name = "data_";
    	std::ostringstream ss;
     
    	for (unsigned int i = 0; i < 4; ++i)
    	{
    		ss << filebase_name << i;
     
    		std::string filename = ss.str();
    		std::cout << filename << std::endl;
    	}
     
    	return 0;
    }
    Qui donne cette sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data_0
    data_0data_1
    data_0data_1data_2
    data_0data_1data_2data_3
    Du coup, tu aurais compris que le std::ostringstream n'est pas réinitialisé.
    Il faut le déclarer dans la boucle for ou le réinitialiser.

    Tu peux aussi écrire une fonction to_string(int).
    En voilà une version générique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <class T>
    std::string to_string(T const & in)
    {
    	// Declare a stream
    	std::ostringstream o;
    	o.precision(std::numeric_limits<T>::digits10 + 1);
    	// Fill the stream
    	o << in;
    	// Output the stream in string
    	return (o.str());
    }
    Ça s'utilise comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string r = to_string(42); // r contient "42"
    Petite remarque / conseil, en C++, tu peux déclarer les variables uniquement là où tu en as besoin et les initialiser directement.

    Bref, ça devrait te permettre d'éviter des erreurs et t'aider à régler ton souci présent

  3. #3
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut
    Salut,

    Citation Envoyé par arthurdubois Voir le message
    pourriez-vous, s´il vous plaît corriger mon programme ?
    Je vais pas corriger ton programme, mais je vais te dire où est ton bug

    Tu n'as pas le droit de réutiliser un ostringstream sans le réinitialiser.
    Ainsi, au 1ier tour de boucle ss contient "data_0", au 2ieme tour "data_0data_1" au 3ieme "data_0data_1data_2" etc...

    Le plus simple dans ton cas, c'est de déclarer "ss" à l'intérieur de ta boucle "for". Comme ça, tu auras une nouvelle instance d'ostringstream à chaque tour de boucle.

  4. #4
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut
    Wow, c'est actif ici pour un vendredi soir... On répond à 2 en même temps.

    On devrait pas être entrain de boire une bière quelque part plutôt ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 110
    Par défaut
    Bonjour,

    tout d´abord je tiens a remercier Ehonn et djuju pour leurs aides.

    Ehonn: j´ai essaye d´adapter ton code de la maniere dont d´aimerais l´utiliser.

    Mais lorsque je compile, je rcois la faute suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Erreur: impossible de lire les fichiers text sucessivement
    Mes fichiers text se trouvent dans le même dossier. Sûrement je me suis encore plante au niveau des codes.

    Pourrais-tu me filer un coup de pouce.

    Merci.

    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
     
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
    	std::string filebase_name = "data_";
    	std::ostringstream ss;
        string line, myline;
        string s = ".txt";
     
    	for (unsigned int i = 0; i < 4; ++i)
    	{
            ss  << filebase_name << i << s ;
    		std::string filename = ss.str();
    		std::ifstream file("filename", ios::in);
     
    		if(!file)
    		{
    		  cout << "Erreur: impossible de lire les fichiers text sucessivement" << endl;
    		  return 1;
    		}
     
            // Lecture ligne par ligne
              while(getline(file, line))
              {
                myline += line;
                cout << myline << endl;
              }
    	}
     
    	return 0;
    }

  6. #6
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut
    Salut,

    Je n'ai pas de compilateur sous la main, mais ça devrait fonctionner :
    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
     
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
        string line, myline;
     
    	for (unsigned int i = 0; i < 4; ++i)
    	{
    	std::ostringstream ss;
            ss  << "data_" << i << ".txt";
    		std::ifstream file(ss.str().c_str(), ios::in);
     
    		if(!file)
    		{
    		  cout << "Erreur: impossible de lire les fichiers text sucessivement" << endl;
    		  return 1;
    		}
     
            // Lecture ligne par ligne
              while(getline(file, line) && !file.bad())
              {
                myline += line;
                cout << myline << endl;
              }
     
              file.close();
    	}
     
    	return 0;
    }

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

    Informations professionnelles :
    Activité : aucun

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

    djuju te l'a pourtant clairement expliqué, tu ne dois pas déclarer ton stringstream hors de la boucle.

    La raison est, finalement, toute simple et porte sur la durée de vie des variables, et donc sur le moment où elles sont détruites.

    En effet, lorsque tu écris un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main()
    {
        std::stringstream ss;
        for(int i=0; i<x; ++i)
        {
             /*...*/
        }
        /* ...*/
        return 0;
    }
    ton stringstream est créé avant la boucle et n'est détruit qu'une fois que tu atteints l'accolade fermante de la fonction main.

    Le résultat est que, chaque fois que tu passeras dans la boucle, toutes les modifications que tu apporteras au stringstream se rajouteront aux modifications qui lui ont été apportées dans les autres boucles.

    Par contre, si tu déclares ton stringstream directement dans la boucle, donc, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main()
    {
        /*...*/
        for(int i=0;i<x; ++i)
        {
            std::stringsream ss; // ss est construit ici
            /* ... */
        }  //ss est détruit ici
        return 0;
    }
    le stringstream sera construit (et donc initialisé) à chaque passage dans la boucle et détruit ) chaque fois que tu atteindras l'accolade fermante de la boucle.

    De ce fait, les modifications que tu pourras apporter dans la boucle à ss seront "annulées" à chaque fois, et tu partiras avec un stringstream vide à chaque passage dans la boucle
    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

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 110
    Par défaut
    Bonsoir,

    J´ai teste ton code. helas je recois a l´ecran:
    Erreur :impossible de lire les fichiers text data_0.txt sucessivement
    Remarque:
    Si ton code marchait, alors le compilo aurait tout simplement lu le fichier data_0. Pourtant j´aimerais lire a tour de rôle le fichier data_0, data_1, data_2 et data_3.

    je me suis permis de modifier ton code. la console me confirme la lecture des fichiers, mais apres je lis a la fin l´erreur suivante:
    Erreur: impossible de lire les fichiers text data_0.txtdata_1.txt sucessivement
    La je suis perdu!! Comment corriger cela !! Les fichiers textes sont en piece jointe.

    code modifie:
    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
     
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
    	std::string filebase_name = "data_";
    	std::ostringstream ss;
        string line, myline;
        string s = ".txt";
     
    	for (unsigned int i = 0; i < 4; ++i)
    	{
            ss  << filebase_name << i << s ;
    		std::string filename = ss.str();
    		std::ifstream file(filename.c_str(), ios::in);
     
    		if(!file)
    		{
    		  cout << "Erreur: impossible de lire les fichiers text" <<" " << filename << " " << "sucessivement" << endl;
    		  return 1;
    		}
     
            // Lecture ligne par ligne
              while(getline(file, line))
              {
                myline += line;
                cout << myline << endl;
              }
    	}
     
    	return 0;
    }
    Fichiers attachés Fichiers attachés

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 110
    Par défaut
    Salut ,

    Merci pour ton intervention koala01. Je viens de lire ton post. Ton commentaire confirme exactement ce que j´ai observe en compilant.

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 110
    Par défaut
    Salut,

    j´ai declare le stringstream dans la boucle et le test a ete un succes.

    Merci encore!!

    le 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
        string line, myline;
        string s = ".txt";
        std::string filebase_name = "data_";
    	for (unsigned int i = 0; i < 4; ++i)
    	{
            std::ostringstream ss;
            ss  << filebase_name << i << s ;
    		std::string filename = ss.str();
    		std::ifstream file(filename.c_str(), ios::in | ios::binary);
     
    		if(!file)
    		{
    		  cout << "Erreur: impossible de lire les fichiers text" <<" " << filename << " " << "sucessivement" << endl;
    		  return 1;
    		}
     
            // Lecture ligne par ligne
              while(getline(file, line))
              {
                myline += line;
                cout << myline << endl;
              }
    	}
     
    	return 0;
    }

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/05/2011, 09h21
  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