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 :

Probleme de lecture de plusieurs fichiers


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut Probleme de lecture de plusieurs fichiers
    Bonjour,

    J'ai besoin d'une aide par rapport à une fonction que je suis en train de créer.

    Je voudrais créer une fonction qui me permettent de lire plusieurs fichiers, en sachant que les fichiers ne sont dans les mêmes directories mais ont le même nom.
    Les paramètre de la fonction sont:
    file_name -> nom des fichiers qui doivent être lu
    current_path -> partie commune du chemin pour les fichiers
    subfolders -> Partie variable du chemin pour les fichiers
    Ces 3 paramètres me permettent de contruire le chemin pour l'ouverture des différents fichiers.

    Mon problème, lors de la compilation de mon code (voir ci-dessous) j'ai une erreur.
    62 C:\Projects\Dev File\test_repertoire.cpp no matching function for call to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(std::string&)'

    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
    vector <string> function_path_read_file (string file_name, string current_path, const vector<string> &subfolders)
    {
    string input_file;
    string temp;
     
        for (int i =0 ; i<subfolders.size();i++)
            //Construction de mon chemin pour ouverture du fichier qui doit être lu
            temp=current_path+'/'+subfolders[i].c_str()+'/'+file_name;    
            // le constructeur de ifstream permet d'ouvrir un fichier en lecture    
            ifstream inputfile(temp);
                if ( inputfile ) // ce test échoue si le fichier n'est pas ouvert
                {
                   string ligne; // variable contenant chaque ligne lue
     
                   // cette boucle s'arrête dès qu'une erreur de lecture survient
                   while (getline( inputfile, ligne ) )
                   {
                   // afficher la ligne à l'écran
                   cout << ligne << endl;
                   }
        }
    }
    Merci par avance.

    David

  2. #2
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Tu ne fais jamais de inputfile.close()?

    De plus, c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream inputfile(temp.c_str());
    et non pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream inputfile(temp);

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par Trunks Voir le message
    Tu ne fais jamais de inputfile.close()?
    C'est inutile car implicitement exécuté à la sortie de la portée où est défini le flux fichier.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    C'est inutile car implicitement exécuté à la sortie de la portée où est défini le flux fichier.
    Ah?! Tu viens de m'apprendre un truc là !

    C'est pas mentionné dans la référence

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    C'est pas la référence... La classe ifstream comme toute les class de la STL implémente le RAII, donc pas besoin d'appeler la méthode close(), sauf dans cas particuliers (on en a parlé dans un topic récemment).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par Goten Voir le message
    La classe ifstream comme toute les class de la STL implémente le RAII, donc pas besoin d'appeler la méthode close(), sauf dans cas particuliers (on en a parlé dans un topic récemment).
    Merci, je ne le savais pas ! Comme quoi, on en apprend tous les jours

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup mieux.

    Mais j'ai encore un problème au niveau de ma boucle for. Car la boucle ne me retourne que la dernière valeur de mon vector (le vecteur contient 4 lignes).

    David

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Ni ce site, ni cppreference ne sont des sites de référence sur le C++ -- ne vous laissez pas abuser.

    dinkumware et roguewave sont en revanche d'excellentes références.

    Ceci dit, sur ce point, j'ai comme l'impression qu'il faut lire entre les lignes dans la norme. En gros, il est suggéré que c'est comme si les basic_*fstream disposaient d'un membre de type basic_filebuf. Et donc là, nous sommes sensés en déduire que la destruction du flux fichier entraine la destruction de son membre, qui elle entraine sa fermeture. Même si dans les faits l'implémentation que l'on utilise ne dispose pas d'un tel membre.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Personne n'a une idée pour mon problème de boucle for.

    Car j'ai un peu l'impression de tourner en rond, et je ne comprend pas pourquoi ma boucle ne me retourne uniquement la derniere valeur de mon vector.

    Merci

    David

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par chicken92000 Voir le message
    Bonjour,

    Personne n'a une idée pour mon problème de boucle for.

    Car j'ai un peu l'impression de tourner en rond, et je ne comprend pas pourquoi ma boucle ne me retourne uniquement la derniere valeur de mon vector.

    Merci

    David
    Tu parles de ces lignes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     for (int i =0 ; i<subfolders.size();i++)
            //Construction de mon chemin pour ouverture du fichier qui doit être lu
            temp=current_path+'/'+subfolders[i].c_str()+'/'+file_name;
    A priori, il n'y a pas de raison.
    Es-tu sûr que ton vecteur contient bien plusieurs élément (fait un dump sur subfolders.size())?

    P.S. : pourquoi ne pas utiliser des itérateurs pour parcourir ton tableau, c'est fait pour ça.
    P.P.S. : et pourquoi ne pas utiliser un for_each. C'est aussi fait pour ça (et perso, je trouve que ça améliore la lisibilité, mais tout le monde n'est pas d'accord sur ce point).

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Affiche au fur et à mesure les noms contenus dans ton vecteur.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Merci pour ta réponse. Et ou c'est bien cette partie.

    J'affiche mon size juste avant de rentrer dans ma boucle for. Et il me retourne bien 4. Mais dans ma boucle for il ne m'affiche uniquement un ligne lors du cout de temp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        cout << subfolders.size();
        for (int i =0 ; i<subfolders.size();i++)
            //Construction de mon chemin pour ouverture du fichier qui doit être lu    
            temp=current_path+'\\'+subfolders[i].c_str()+'\\'+"information"+'\\'+file_name;
            cout <<temp<< endl;
    David

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    J'aurais tendance à penser que ton problème est au remplissage du vecteur. Es-tu sûr d'y mettre 4 valeurs distinctes ?

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Bon j 'ai mis un peu plus de trace (voir ci-dessous) pour avoir plus d'information.

    La console affiche donc:
    function_read_write_file
    4
    .
    ..
    test1
    Test2
    C:\Projects\Swift\Dev File\Test2\Information\events.csv
    Les lignes du fichier qui a été ouvert

    et je n'ai rien d'afficher pour le test1

    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
    void function_read_write_file (string file_name, string current_path, const vector<string> &subfolders)
    {
    string input_file;
    string temp;
    int nbr_file;
    int nbr_line;
     
        cout << "function_read_write_file"<< endl;
        cout << subfolders.size()<< endl;
        for (int i =0 ; i<subfolders.size();i++)
            cout << subfolders[i].c_str()<< endl;
     
        for (int i =0 ; i<subfolders.size();i++)
            //Construction de mon chemin pour ouverture du fichier qui doit être lu    
            temp=current_path+'\\'+subfolders[i].c_str()+'\\'+"information"+'\\'+file_name;
            cout <<temp<< endl;    
            // le constructeur de ifstream permet d'ouvrir un fichier en lecture    
            ifstream inputfile(temp.c_str());
                if ( inputfile ) // ce test échoue si le fichier n'est pas ouvert
                {
                   string ligne; // variable contenant chaque ligne lue
     
                   // cette boucle s'arrête dès qu'une erreur de lecture survient
                   while (getline( inputfile, ligne ) )
                   {
                   // afficher la ligne à l'écran
                   cout << ligne << endl;
                   }
        }
    }

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Au début j'ai pensé qu'il s'agissait d'une erreur de copier/coller de ton code. Mais là, j'ai un doute : n'aurais-tu pas oublié les accolades après le for?
    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
    void function_read_write_file (string file_name, string current_path, const vector<string> &subfolders)
    {
    string input_file;
    string temp;
    int nbr_file;
    int nbr_line;
       
        cout << "function_read_write_file"<< endl;
        cout << subfolders.size()<< endl;
        for (int i =0 ; i<subfolders.size();i++)
            cout << subfolders[i].c_str()<< endl;
        
        for (int i =0 ; i<subfolders.size();i++)
        {
            //Construction de mon chemin pour ouverture du fichier qui doit être lu    
            temp=current_path+'\\'+subfolders[i].c_str()+'\\'+"information"+'\\'+file_name;
            cout <<temp<< endl;    
            // le constructeur de ifstream permet d'ouvrir un fichier en lecture    
            ifstream inputfile(temp.c_str());
                if ( inputfile ) // ce test échoue si le fichier n'est pas ouvert
                {
                   string ligne; // variable contenant chaque ligne lue
     
                   // cette boucle s'arrête dès qu'une erreur de lecture survient
                   while (getline( inputfile, ligne ) )
                   {
                   // afficher la ligne à l'écran
                   cout << ligne << endl;
                   }
                }
        }
    }

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Bien vu l'aveugle.

    Désole de t'avoir déranger pour un problème aussi bête.

    Encore merci pour ta précieuse aide

    David

  17. #17
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Une règle de codage qui peut paraître lourde mais qui évite ce genre de bug : TOUJOURS mettre des accolades (for, while, if, else ...) même s'il y a une seule ligne de code. Ça ne coûte que la première fois que tu tape ton code

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

Discussions similaires

  1. Probleme de lecture dans un fichier
    Par Bebert71 dans le forum C
    Réponses: 7
    Dernier message: 15/01/2007, 19h28
  2. Probleme de lecture d'un fichier
    Par Jim_Nastiq dans le forum Langage
    Réponses: 10
    Dernier message: 27/06/2006, 09h53
  3. Probleme de lecture d'un fichier avec caractères speciaux
    Par bygui dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 26/06/2006, 09h35
  4. Gros probleme de lecture d'un fichier texte
    Par Draekonyss dans le forum C
    Réponses: 12
    Dernier message: 25/04/2006, 09h25
  5. Probleme de lecture d'un fichier XML
    Par chleuh dans le forum Langage
    Réponses: 8
    Dernier message: 30/08/2005, 12h04

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