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 :

ouvrir lire charger fichier


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Points : 15
    Points
    15
    Par défaut ouvrir lire charger fichier
    Slt,

    est-ce que qq1 a un exemple de code ou l'on ouvre un fichier .txt dans lequel on a des valeurs, ensuite on le lit, puis on charge ces valeurs dans un vector<>?

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Avec les stream_iterator c'est très simple, tu peux charger les valeurs directement dans le vecteur. Par exemple pour des int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <iostream>
     
    int main()
    {
      std::ifstream fichier("mon_fichier.txt");
      std::vector<int> valeurs(
        (std::istream_iterator<int>(fichier)),
        std::istream_iterator<int>());
      if (!fichier.eof())
        std::cerr << "Erreur de lecture !\n";
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Avec les stream_iterator c'est très simple, tu peux charger les valeurs directement dans le vecteur. Par exemple pour des int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <iostream>
     
    int main()
    {
      std::ifstream fichier("mon_fichier.txt");
      std::vector<int> valeurs(
        (std::istream_iterator<int>(fichier)),
        std::istream_iterator<int>());
      if (!fichier.eof())
        std::cerr << "Erreur de lecture !\n";
    }

    Salut a tous, j'ai une question concernant ces commandes a laquelle je ne trouve pas de réponse. Je veux également lire un fichier txt, mais le fichier a ouvrir n'est pas connu a la compilation, et je veux laisser l'utilisateur rechercher sur le disque le fichier, de la même manière que lorsque l'on clique sur le bouton "ouvrir" dans la plupart des programme...
    Une idée ?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par galadorn Voir le message
    Salut a tous, j'ai une question concernant ces commandes a laquelle je ne trouve pas de réponse. Je veux également lire un fichier txt, mais le fichier a ouvrir n'est pas connu a la compilation, et je veux laisser l'utilisateur rechercher sur le disque le fichier, de la même manière que lorsque l'on clique sur le bouton "ouvrir" dans la plupart des programme...
    Une idée ?
    C'est *relativement* simple:

    1- tu récupère le nom du fichier à ouvrir dans une chaine de caractères (std::string, par exemple, c'est l'idéal )
    2- tu transmet cette chaine en veillant à la passer sous la forme d'une chaine "C style" (c'est une vieille restriction des *fstream) au constructeur, en lieu et place de "fichier.txt".

    Cela te donne, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
        std::string str;
        /* récupération du nom de fichier dans str... à toi de voir comment
         * faire selon la bibliothèque IHM que tu utilise :D
         */
       std::ifstream fichier(str.c_str());
       std::vector<int> valeurs( (std::istream_iterator<int>(fichier)),
                                   std::istream_iterator<int>());
      if (!fichier.eof())
        std::cerr << "Erreur de lecture !\n";
     
    }
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    merci !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    hum encore une question qui va pas être très dur a solutionner je pense, enfin je l'espère en tout cas ^^

    j'ai écrit dans mon code :
    std::ofstream fichier("C:\test.txt", ios::app);
    fichier>>"n importe quoi";

    mais rien ne se passe, le fichier n'est même pas créé.
    Si je créé un fichier nomé test.txt au bon emplacement, rien ne s'écrit dessus, même quand celui ci est fermer. Qu'ai-je fait de mal ?

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ton ne devrait même pas compiler (En tout cas, ceci ne compile pas chez moi)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <fstream>
     
    int main(int argc, char const *argv[])
    {
        std::ofstream fichier("test.txt", std::ios::app);
        fichier>>"n importe quoi";
        return 0;
    }
    >> est pour lire depuis un flux, << est pour écrire dedans.
    Il faut donc faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <fstream>
     
    int main(int argc, char const *argv[])
    {
        std::ofstream fichier("test.txt", std::ios::app);
        fichier<<"n importe quoi";
        return 0;
    }
    La prochaine fois, essaye de chercher un peu par toi même, c'est une erreur très basique tu aurais sans doute pu trouver la réponse dans une cours sur les flux du C++.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Il faut savoir que l'anti slash (ou back slash) "\" est connu comme caractère d'échappement.

    C'est pour cela que '\0', '\n','\t" et tant d'autres sont considérés comme des caractères uniques.

    Lorsque tu écrit "c:\text.txt", "\t" est donc considéré comme... un caractère unique qui, en l'occurrence, correspond à la tabulation.

    Si tu veux utiliser l'anti slash en tant que tel, tu dois... l'échapper, ce qui donne "c:\\text.txt"
    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

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    c'etait une erreur de retranscription, j'avais bien entendu fait :


    std::ofstream fichier("C:\test.txt", ios::app);
    fichier<<"n importe quoi";



    mettre std::ios::app ne change rien a mon histoire...heum ça devient louche.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Il faut savoir que l'anti slash (ou back slash) "\" est connu comme caractère d'échappement.

    C'est pour cela que '\0', '\n','\t" et tant d'autres sont considérés comme des caractères uniques.

    Lorsque tu écrit "c:\text.txt", "\t" est donc considéré comme... un caractère unique qui, en l'occurrence, correspond à la tabulation.

    Si tu veux utiliser l'anti slash en tant que tel, tu dois... l'échapper, ce qui donne "c:\\text.txt"
    haaaaaaaaaaaaaaaaaaaaaaaa c'est donc ça !! j'aurais pu chercher bien longtemps sans ton aide ! Un tout grand merci !

  11. #11
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Peut être un fichier.open(); serait-il le bienvenu? Et aussi un fichier.close(); à la fin? Essaie ...
    Raphchar.

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par raphchar Voir le message
    Peut être un fichier.open(); serait-il le bienvenu? Et aussi un fichier.close(); à la fin? Essaie ...
    Malheureux... surtout pas...

    Je m'explique:

    Il existe un principe que l'on appelle RAII (Ressource Acquisition Is Initialization), qui conseille de tout faire en de manière à obtenir des objets totalement initialisés au moment où on les crées.

    L'effet inverse, c'est que la destruction d'un objet provoque la libération des ressources.

    Pour les fichiers, il existe (c'est fait pour ) un constructeur qui prend un nom de fichier et éventuellement des flags de positionnement, qui fait que le fichier est bel et bien ouvert lorsque l'objet est créé.

    Inversement, le destructeur des classes *fstream provoque... la fermeture du fichier.

    L'objet étant détruit dés que l'on quitte la portée dans laquelle il est déclaré, le fichier sera donc bel et bien fermé

    Il n'y a donc aucune raison pour inciter les gens à utiliser open et close lorsque ce n'est pas utile, car cela revient à se faire du mal pour rien, en plus d'inciter à risquer des problèmes (que se passerait-il si on essayait d'ouvrir un fichier... déjà ouvert )

    Le seul cas dans lequel il peut effectivement être utile d'envisager le recours à open et à close, c'est si tu envisage la création d'une classe dont un des membres est un *fstream, et que tu souhaite pouvoir décider du nom du fichier à ouvrir "à la volé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

  13. #13
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    D'accord, je vais donc supprimer ces fonctions de mes programmes.
    Raphchar.

  14. #14
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par raphchar Voir le message
    D'accord, je vais donc supprimer ces fonctions de mes programmes.
    Je n'irai pas jusqu'à dire qu'il faut reprendre l'ensemble des programmes que tu as pu créer ces dix dernières années pour supprimer le travail en deux temps que tu t'es imposé juqu'à présent, loin de là, mais il est sans doute opportun d'en tenir compte pour la suite

    Chaque fois que tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ifstream ifs;
    ifs.open("fichier.txt");
    /*...*/ 
    ifs.close();
    ou un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ofstream ofs;
    ofs.open("fichier.txt");
    /*...*/ 
    ofs.close();
    tu peux estimer qu'un
    simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ifstream ifs("fichier.txt");
    /* respectivement */
    ofstream ofs("fichier.txt");
    aurait largement suffit
    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

  15. #15
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Oui effectivement, c'est surtout de ne pas avoir fait passer le nom du fichier dans le constructeur qui m'oblige à appeller la fonction open();
    Raphchar.

Discussions similaires

  1. Lire un fichier avec la boite de dialogue Ouvrir
    Par Death83 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/11/2007, 16h34
  2. Ouvrir, lire, écrire, ferme fichier .txt
    Par greg26 dans le forum VB.NET
    Réponses: 13
    Dernier message: 19/09/2007, 17h12
  3. ouvrir et lire un fichier sur serveur distant
    Par coco441 dans le forum C++
    Réponses: 4
    Dernier message: 04/09/2007, 13h26
  4. Ouvrir et lire un fichier .csv
    Par Art19 dans le forum Composants VCL
    Réponses: 20
    Dernier message: 12/08/2007, 23h18
  5. Réponses: 5
    Dernier message: 11/01/2004, 20h17

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