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 :

[C++] lecture/ecriture dans fichier txt/binary


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut [C++] lecture/ecriture dans fichier txt/binary
    Bonjour!
    Voila, j'ai un petit soucis...
    Je voudrai faire une fonction d'ecriture et de lecture qui puissent fonctionner que ce soit en mode binaire ou en mode txt.
    J'ai l'impression que l'operateur << ne marche pas en mode binaire, je me trompe?

    Voici mon code d'ecriture pour le text et le binaire :

    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
     
    */  	
    void maClasse::writeTextFile (vector<string> vParameters)
    {
    ifstream _fWrite:
    _fWrite.open ("monfichier", ios::out) ;
    	for (unsigned int i = 0 ; i < vParameters.size() ; i++)
    	{
    		_fWrite << vParameters[i] << "\t" ;
    	}
     
    	_fWrite << endl ;
    }
     
    template<typename T>
    std::ostream& write(std::ostream& os, const T& value)
    {
        return os.write(reinterpret_cast<const char*>(&value), sizeof(T));
    }
     
     
    void maClasse::writeBinaryFile (vector<string> vParameters)
    {
    ifstream _fWrite:
    _fWrite.open ("monfichier", ios::out|ios::binary) ;
    	for (unsigned int i = 0 ; i < vParameters.size(); i++)
    	{
    		string value = vParameters[i] ;
    		write (_fWrite, value) ;
    	}
    }
    N'y a t'il pas un moyen de n'avoir qu'une seule fonction?

    Maintenant la lecture...
    Pour lire du texte, pas de soucis.
    Par contre, je n'arrive pas a lire mon fichier binaire et a recuperer les strings que j'ai ecris...
    Voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void maClasse::readBinaryFile (vector<string> &vParameters)
    {
        ifstream _fRead ;
        _fRead.open ("monfichier", ios::in|ios::binary) ;
    	string buffer = "";
     
    	while (!_fRead.eof())
    	{
    		_fRead.read(reinterpret_cast<char*>(&buffer), sizeof(string));
    	}
    }
    Avez vous une idee ? peut on lire des string en binaire?

    Merci!!

  2. #2
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Salut,

    Tout d'abord n'oublie pas de lire la FAQ à propos de l'utilisation des fichiers.

    Pour ton soucis, d'abord c'est étrange que ton code compile. Tu cherches à utiliser la fonction membre write sur un objet ifstream, qui est la pour la lecture et non pour l'écriture. Pour écrire dans un fichier, utilise donc un objet std::ofstream, ou std::fstream (qui peut-être utilisé pour la lecture ET l'écriture).

    D'autre part, n'oublies-tu pas tout simplement de fermer tes fichiers en utilisant _fWrite.close ? Car si tu ne fermes pas ton fichier sur lequel tu écris, forcément tu pourras pas lire dessus après :p.
    Concernant ton problème de lecture, chez moi ça marche très bien. Juste que la, le soucis, c'est que potentiellement ton tableau de string vParameters peut contenir plusieurs chaînes de caractères, c'est à dire plusieurs appels à read, or chaque appel à read remplacera le contenu de ton buffer, c'est à dire qu'à la fin, tu n'auras dans ton objet buffer QUE le dernier élément lu. Pour remedier à ceci, tu peux peut-être utiliser quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void maClasse::readBinaryFile (vector<string> &vParameters)
    {
        ifstream _fRead ;
        _fRead.open ("monfichier", ios::in|ios::binary) ;
    	string buffer, stringFinale;
     
    	while (!_fRead.eof())
    	{
    		_fRead.read(reinterpret_cast<char*>(&buffer), sizeof(string));
                    stringFinale += buffer;
    	}
    }
    Sinon, peut-être qu'avec les stringstream il y a moyen de tout charger d'un coup, je sais pas .

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il ne faut jamais boucler une lecture sur !eof() ; ça doit être expliqué dans la FAQ.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Merci pour vos reponses.

    le eof n'est pas conseille seulement pour compter les lignes, non?


    Je n'ai pas oublié le close dans mon code...


    Bakura, ton code est le meme que le mien... Chez moi ca ne marche pas...
    Tu aurai un exemple d'ecriture/lecture en binaire?
    Peut etre que c'est mon ecriture qui n'est pas bonne...

    Merci!

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    mon code est tiré de la FAQ.
    Cette exemple marche tres bien pour les entiers mais pas pour les strings...
    Enfin, pas chez moi du moins...

  7. #7
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Et en essayant d'extraire seulement une seule ligne (un seul appelle à read ?). J'ai essayé hier en insérant plusieurs string, et je pouvais les lire sans problème :/.

Discussions similaires

  1. lecture identification dans fichier txt fscanf fseek
    Par bigb0y dans le forum Débuter
    Réponses: 7
    Dernier message: 09/10/2013, 15h35
  2. foumulaire et ecriture dans fichiers txt
    Par loribac dans le forum Langage
    Réponses: 2
    Dernier message: 11/07/2012, 14h49
  3. [Débutant] Problème Ecriture dans fichier .txt
    Par Patatattak dans le forum VB.NET
    Réponses: 1
    Dernier message: 15/07/2011, 20h02
  4. Ecriture dans fichier txt
    Par yrondi dans le forum Excel
    Réponses: 3
    Dernier message: 23/09/2008, 13h43

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