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 :

Charger un fichier en mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 42
    Par défaut Charger un fichier en mémoire
    Bonjour, j'aimerai charger un fichier en mémoire comme ceci:

    Un vecteur de chaines de caractères, chaque élément du vecteur correspond à une ligne du fichier.

    Voila comment j'ai fait mais ça marche pas:

    Code c++ : 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
    #include <iostream>
    #include <stdio.h>
    #include <vector>
     
     
    using namespace std;
     
    int main()
    {
        unsigned int i=0,j=0;
        const char *filename = "C:\\test.txt";
        FILE* fichier = NULL;
        vector<char *> ligne;
        char tmp[1000];
        fichier = fopen(filename, "r");
        if (fichier != NULL){
            while (fgets(tmp, 1000, fichier) != NULL){
                ligne.push_back(tmp);
                i++;
            }
            fclose(fichier);
            for (i=0;i<ligne.size();i++)
                printf("[%d] %s\n",i, ligne[i]);
     
        } else {
            printf("Erreur : impossible d'ouvrir le fichier\n");
        }
        return 0;
    }


    Ça m'affiche la dernière ligne du fichier autant de fois qu'il y a de ligne dans le fichier.

    Pouvez vous m'aider svp? Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    le résultat est tout à fait normal.

    Le vector stocke des pointeurs sur chaîne de caractères.
    A chaque lecture de ligne tu y stockes tmp qui contient la dernière chaîne lue, qui change à chaque ligne, mais le pointeur lui ne change pas, pas plus que les pointeurs précédemment enregistrés dans le vector.

    Quitte à être en C++
    std::ifstream
    std::string

    Dans ton cas, peut-être qu'en faisant la modification uniquement de stocker des std::string et non des char* suffirait à ce que l'algorithme "fonctionne".
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    +1, utilise un std::ifstream, un vecteur de std::string, et la fonction globale std::getline() qui prend une référence de string en paramètre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ifstream fichier("C:\\test.txt")
    vector<string> result;
    string currentLine;
    while(getline(result, currentLine)
    {
      result.push_back(currentLine);
    }
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    En une ligne? (tiré de la FAQ, non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::ifstream fichier("C:\\test.txt")
    std::vector<std::string> result(std::istream_iterator<std::string>(fichier), (std::istream_iterator<std::string>()));
    [Edit]: en fait ça ne marcherait pas puisque le code que j'ai posté te stockerai chaque mot du fichier dans ton vecteur et non pas chaque ligne comme tu le souhaites, ça m'apprendra à poster sans prendre le temps de lire avec attention la question de l'OP

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 42
    Par défaut
    Merci à tous pour vos réponses


    Citation Envoyé par JolyLoic Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ifstream fichier("C:\\test.txt")
    vector<string> result;
    string currentLine;
    while(getline(result, currentLine)
    {
      result.push_back(currentLine);
    }
    Ce qui donne:

    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
    #include <iostream>
    #include <stdio.h>
    #include <vector>
    #include <string>
    #include <fstream>
     
     
    using namespace std;
     
    int main()
    {
        ifstream fichier("C:\\test.txt");
        vector<string> result;
        string currentLine;
        while(getline(result, currentLine))
        {
          result.push_back(currentLine);
        }
        return 0;
    }
    Mais j'ai l'erreur:
    C:\Users\xxx\xxx\main.cpp|15|error: no matching function for call to 'getline(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::string&)'|

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Désolé, j'ai tapé le code trop vite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while(getline(fichier, currentLine))
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Charger un fichier en mémoire depuis une URL
    Par ValyGator dans le forum C++
    Réponses: 11
    Dernier message: 12/01/2007, 16h16
  2. Comment charger un fichier en mémoire ?
    Par Capt. Flame dans le forum Framework .NET
    Réponses: 10
    Dernier message: 27/09/2006, 18h40
  3. [Dexplore] Comment charger des fichiers d'aide ?
    Par Laurent Dardenne dans le forum Windows
    Réponses: 5
    Dernier message: 04/01/2005, 17h38
  4. Détourner une fonction pour copier un fichier en mémoire
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/11/2003, 08h29
  5. [TP]Charger un fichier bmp
    Par flavien tetart dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 30/06/2002, 19h04

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