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 :

[ifstream] problème de donnée-membre de type ifstream


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut [ifstream] problème de donnée-membre de type ifstream
    Bonsoir,

    je souhaite faire une classe de manipulation de fichier, et mon problème se situe au niveau des appels à ma méthode readline(). Elle ne me retourne jamais rien, alors que le fichier n'est pas vide ...

    Je ne comprends pas d'où provient l'erreur, vous auriez une idée ?

    filereader.h
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #ifndef _FILEMANAGER_H
    #define _FILEMANAGER_H
     
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    class FileReader {
            // Nom du fichier
            string _filename;
     
            // Représente le flux
            ifstream _stream;
     
            // Ligne courante du fichier
            string _currentline;
     
            // Nombre de lignes du fichier
            long _linenumber;
     
            // Numéro de ligne courante
            long _currentlinenumber;
     
            // Indique la fin du fichier
            bool _eof;
     
            /**
             * Initialise les données-membres de la classe
             */
            void init();
     
            /**
             * Ouvre le flux et compte le nombre de lignes
             */
            void open(const string& filename);
     
            /**
             * Ferme le flux
             */
            void close();
     
        public:
     
            /**
             * Constructeur d'initialisation
             */
            FileReader(const string filename);
     
            /**
             * Destructeur
             */
            ~FileReader();
     
            /**
             * Retourne la prochaine ligne du flux
             */
            string readline();
     
            /**
             * Repositionne la lecture du flux au début
             */
            void begin();
     
            /**
             * Indique si le flux est ouvert
             */
            bool isOpened();
     
            inline string filename() const { return _filename; }
            inline void setFilename(const string& filename) { _filename = filename; }
            inline string currentline() const { return _currentline; }
            inline long linenumber() const { return _linenumber; }
            inline long currentlinenumber() const { return _currentlinenumber; }
            inline bool eof() const { return _eof; }
    };
     
    #endif // _FILEMANAGER_H
    filereader.cpp
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    FileReader::FileReader(const string filename)
    {
        _filename = filename;
        open(_filename);
    }
    //------------------------------------------------------------------------------------------
     
    /**
     *
     */
    void FileReader::init()
    {
        _eof = false;
        _currentline = "";
        _linenumber = 0;
        _currentlinenumber = 0;
    }
    //------------------------------------------------------------------------------------------
     
    /**
     *
     */
    FileReader::~FileReader()
    {
        close();
    }
    //------------------------------------------------------------------------------------------
     
    /**
     *
     */
    void FileReader::open(const string& filename)
    {
        init();
     
        _stream.open(filename.c_str(), ios::in|ios::binary);
        char c;
     
        if (isOpened())
        {
            begin();
     
            while (_stream.read ((char*) &c, sizeof(char)), !_stream.eof())
            {
                if (c == '\n')
                {
                    _linenumber++;
                }
            }
     
            begin();
        }
    }
    //------------------------------------------------------------------------------------------
     
    /**
     *
     */
    void FileReader::close()
    {
        if (isOpened())
        {
            _stream.close();
        }
    }
    //------------------------------------------------------------------------------------------
     
    /**
     *
     */
    void FileReader::begin()
    {
        _stream.seekg(0, ios::beg);
        _currentlinenumber = 0;
    }
    //------------------------------------------------------------------------------------------
     
    /**
     *
     */
    string FileReader::readline()
    {
        //Quelle que soit la méthode d'extraction utilisée, ça ne marche pas!!
     
        getline(_stream, _currentline);    
    /*
        char line[1024];
        _stream.getline(line, 1024);
        _currentline = line;
    */
    /*
        char c;
        _currentline = "";
        while (_stream.get(c), !_stream.eof())
        {
            _currentline += c;
            if (c == '\n')
            {
                break;
            }
        }
    */
        if (_stream.eof())
        {
            _eof = true;
        }
     
        return _currentline;
    }
    //------------------------------------------------------------------------------------------
     
    /**
     *
     */
    bool FileReader::isOpened()
    {
        return (_stream.good());
    }

  2. #2
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut
    bon, j'ai continué à chercher et ça a été payant

    le problème vient du fait que je lise le fichier jusqu'à la fin pour compter le nombre de lignes.
    Ce que je ne comprends pas en revanche, c'est que le positionnement du flux au début du fichier ne fonctionne pas du tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _stream.seekg(0, ios::beg);
    Cette ligne n'a aucun effet sur _stream apparemment ...

    si quelqu'un a une piste, je suis preneur

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Points : 402
    Points
    402
    Par défaut
    Bonjour,
    Ne serait-il pas judicieux de contrôler si le flux est en état correct à l'aide de la méthode fail.
    De plus, il me semble que ce serait judicieux d'avoir une stratégie correct de gestion d'exceptions.
    Si la gestion d'exception n'a pas été posté volontairement pour ne pas alourdir le code posté, alors ignorer ce post.
    Bon courage pour le debuguage c'est toujours la partie la plus délicate de la programmation.
    A bientot

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

Discussions similaires

  1. type de champ: liste déroulante (problème ajout données)
    Par aba_tarn dans le forum VBA Access
    Réponses: 0
    Dernier message: 26/07/2007, 14h25
  2. Réponses: 1
    Dernier message: 27/07/2005, 17h08
  3. Réponses: 3
    Dernier message: 24/04/2005, 14h19
  4. Problème avec les champs de type table
    Par devdev dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/12/2004, 16h05
  5. Réponses: 6
    Dernier message: 08/11/2004, 18h23

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