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

Langage C++ Discussion :

Souci de lecture de fichier


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Par défaut Souci de lecture de fichier
    Bonjour à tous.

    Je me remets actuellement au C++, et je dois notamment lire le contenu d'un fichier. J'ai lu pas mal de forums dont celui-ci, et j'ai testé deux méthodes, mais je rencontre dans les deux cas le même problème. Voici le code de ma fonction posant problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {
    ifstream fichier( "test.txt" );
    stringstream buffer;
    buffer << fichier.rdbuf();
    fichier.close();
    }
    Et voici l'exemple de fichier test.txt que j'utilise:
    abc;fg
    1;2
    4
    Le souci que je rencontre est le suivant:

    En exécutant en mode debug, avec un point d'arrête au niveau de fichier.close, je me retrouve avec dans buffer le contenu suivant:

    abc;fg
    1;2
    4ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««îþîþ
    J'ai également eu un buffer avec un contenu de ce genre en utilisant des CFile et CString pour lire le fichier, et je ne comprends pas du tout d'où ça peut venir.

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    J'en suis pas sur, mais je dirai que le rdbuf place tout le contenu du buffer. Y compris les cases "vides" (POD). Donc c'est une mauvaise idée de faire du << sur un streambuff...

    Deuxième solution, as-tu pensé à assuré une ligne vide à la fin de ton fichier ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Par défaut
    Je sais pas si ça vient du rdbuf et de <<, vu que j'avais le même problème avec un code du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    {
    CFile *fichier = NULL;
     
    fichier = new CFile();
    fichier->Open(("test.txt"), CFile::modeRead | CFile::shareDenyNone, NULL);
    int taille= fichier->GetLength();
    char *buffer = new char[taille];
     
    fichier->Read(buffer, taille);
    fichier->Close();
    }
    Concernant la ligne vide à la fin du fichier, j'ai réessayé en sautant des lignes après le dernier caractère, ça n'a rien changé, est-ce que c'est de ça que tu parlais?

    Merci.

  4. #4
    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
    Par défaut
    Salut,
    Le problème avec la version MFC c'est que ton tableau de char n'a pas de '\0'. Donc tu ne peux l'utiliser comme une chaîne de caractère.
    [EDIT] : au pire tu aurais du faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {
    CFile *fichier = NULL;
     
    fichier = new CFile();
    fichier->Open(("test.txt"), CFile::modeRead | CFile::shareDenyNone, NULL);
    int taille= fichier->GetLength();
    char *buffer = new char[taille+1];
     
    taille = fichier->Read(buffer, taille);
    buffer[taille] = 0;
    fichier->Close();
    }
    Avec la version STL et les streams, comment détermines-tu le contenu de buffer ? Peux-tu montrer le code ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Par défaut
    Désolé pour les balises pour le code, j'avais cherché mais apparemment pas assez.

    D'après ce que m'a dit un collègue, j'avais mal géré la fin du fichier.
    Donc j'ai rajouté un saut de ligne '\n' suivi d'un 'E' dans le fichier, et j'ai utilisé AfxExtractSubString avec '\nE' comme délimiteur. Résultat, ça marche. Par contre je sais pas si c'est très propre.

    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
     
    {
    CFile *fichier = NULL;
     
    fichier = new CFile();
    fichier->Open(("test.txt"), CFile::modeRead | CFile::shareDenyNone, NULL);
    int taille= fichier->GetLength();
    char *buffer = new char[taille];
     
    fichier->Read(buffer, taille);
    fichier->Close();
     
    CString buffer1=CString(buffer);
    CString buffer2;
    AfxExtractSubString(buffer2,buffer1,0, '\nE');
    }
    Je n'ai pas très bien compris la question sur le contenu de buffer, tout est dans ce que j'ai posté (code et contenu du fichier).

  6. #6
    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
    Par défaut
    1/A mon avis ta version MFC souffre toujours du problème que tu injectes dans buffer1 un char* qui ne se termine pas par '0'. Tu devrais utiliser taille+1 et forcer buffer[taille] à 0. Au fait, il manque le delete[]buffer.

    2/Pour la version STL, tu dis que le contenu de buffer est
    abc;fg
    1;2
    4ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««îþîþ
    Comment le sais-tu ?

Discussions similaires

  1. Souci de lecture sur des fichiers
    Par clojo dans le forum MATLAB
    Réponses: 4
    Dernier message: 10/03/2013, 18h43
  2. Souci de lecture du fichier XML
    Par cadeau10 dans le forum Android
    Réponses: 3
    Dernier message: 12/05/2011, 15h41
  3. Soucis avec lecture d'un Boolean dans un fichier property
    Par timbrochier dans le forum Langage
    Réponses: 2
    Dernier message: 01/10/2010, 18h28
  4. quelques soucis de lecture de fichiers avec fscanf
    Par monsieurab dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 05/11/2008, 14h28
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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