[C++] surcharge des operateurs >> et fichier

Résolu/Fermé
kiroukou Messages postés 22 Date d'inscription dimanche 16 janvier 2005 Statut Membre Dernière intervention 8 novembre 2005 - 15 avril 2005 à 07:47
 Ader - 25 avril 2008 à 00:45
Bonjour.
Me revoila avec un petit problème qui me bloque bien. Il s'agit en gros de pourvoir, a l'aide des operateurs >>, lire un entier ds un fichier texte, et l'attribuer a une variable.
Alors voila une classe :

#include "FileOf.h"

#ifndef _R_FILE_OF_INT_H
#define _R_FILE_OF_INT_H

// --- Classe de gestion de fichiers en lecture.
class R_File_of_Int:public FileOf
{
protected:
	//--- Methodes 
	//--- on concrétise cette classe en implémentant cette méthode
	void _open(void) ;

public:
	//--- Constructeur / Destructeur
	R_File_of_Int(const char*);
	virtual ~R_File_of_Int();
	//--- surcharges d'opérateur avec fonction amie.
	friend void operator>>( R_File_of_Int, int&) ;

};


R_File_of_Int::R_File_of_Int(const char* nom) : FileOf(nom)
{
	_open();
}

R_File_of_Int::~R_File_of_Int()
{
	;
}

void R_File_of_Int::_open(void)
{
	_filestr.open (_fileName, std::fstream::out );
}



//--- partie a mettre en template apres
//--- pour faire instance >> iVal  pour lire le caractere ds le fichier et le mettre dans la variable iVal
void operator>>( R_File_of_Int wf, int& val)
{
	char chaine[1];
	wf._filestr.read (chaine,sizeof(char));
	wf.from_string( chaine, val );
}

#endif


FileOf est une classe virtuelle pure me servant de base pour faire des classes de lecture de fichier et d'éctiture de fichier (demandez pas pourquoi , c'est un exo de cours... lol)
Voila ce que naivement je pensais qui pourrai marcher :
#include <iostream>
#include "FileOf.h"
#include "W_File_of_Int.h"
#include "R_File_of_Int.h"
int main()
{
	using namespace std;
	
	cout << "test" << endl;	
	R_File_of_Int f("toto.txt");
	
	if(f)
	{
		cout << "fichier ouvert" << endl;
		int val;
		f >> val;
		cout << "val = " << val << endl;
	}
	else
	{
		cout << "impossible d'ouvrir le fichier" << endl;
	}
	
	return 0;
}


L'idée est donc de surcharger l'opérateur >> pour faire une opération de lecture sur le fichier. Seulement bien entendu ca ne marche pas....

Merci d'avance de m'aider à me corriger :)
++

8 réponses

FileOf est une classe virtuelle pure
On appelle ça une classe abstraite.
void operator>>( R_File_of_Int wf, int& val)
{
	char chaine[1];
	wf._filestr.read (chaine,sizeof(char));
	wf.from_string( chaine, val );
}


Hoùlà !!! Pas beau !!! Regarde, y'à qu'un seul caractère dans ta chaîne. Ca marche pas pour les int, juste pour les chiffres de 0 à 9 !!

Voilà ce que je te conseille de faire :
void operator>>( R_File_of_Int wf, int& val)
{
	wf._filestr >> val;
}


Sinon, fais plutôt un _filestr.open (_fileName, std::fstream::in );
0
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177
16 avril 2005 à 16:18
salut, le operator>> return un &ostream et non un void
le operator<< return un &istream et non un void. Donc ta signature devrait etre :
friend istream& operator>>(const istream& is, R_File_Of_Int& rf);
friend ostream& operator<<(const ostream& os, R_File_Of_Int& rf);

//Les définitions :

istream& operator>>(const istream& is, R_File_Of_Int& rf) {
  ...
  return is;
}
friend ostream& operator<<(const ostream& os, R_File_Of_Int& rf) {
 ...
 return os;
}

0
Exact, j'avais zappé ça.

Mais dans le cas de kirikou ce serais plutôt un FileOf_Int& à la place de istream&...
0
kiroukou Messages postés 22 Date d'inscription dimanche 16 janvier 2005 Statut Membre Dernière intervention 8 novembre 2005
17 avril 2005 à 13:13
Merci à tous pour vos reponse :)
Enfait j'ai résolu le problème en mettant la surcharge de l'opérateur >> en fonction memre et non plus en fonction amie, et en faisant comme SKZ le dit :)
Je me suis emmélé avec les in et out au moment de l'ouverture aussi :)

Merci de vos reponses , c'est tres sympas !!

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Wani Messages postés 2 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 23 avril 2005
19 avril 2005 à 20:44
Bonjour,

Je voudrais créer une classe en C++ qui permet de gérer des fichiers de n´importe quel type. Ce serait une classe fichier de X ou X pourrait etre n´importe quelle classe ou type. En clair, je veux pouvoir sauvegarder et restaurer dans un fichier une suite finie de données de n´importe quel type.

Etant encore novice en C++, je pense créer une classe Template FICHIER d´ou je creerais 2 classes dérivées permettant d´ecrire ou de lire dans un fichier. Le type de données a enregistrer dans le fichier serait donc fourni dans le programme apppelant.
Au vu de ton message sur le forum, tu as apparemment expérimenté la gestion des fichiers en C++.
Serait-il possible que tu me donnes quelques pistes ? ta classe <fileof> me semble fort intéressante.

Merci beaucoup d´avance.

WT
0
Y'a aucun soucis pour faire ce que tu veux, même pas besoin de classe fille :

template 
class FileOf<class T> {
  FileOf();
  virtual ~FileOf();

  T getElem();
  void addElem();

  private:
  fstream fs;
};


Avec getElem et addElem qui peuvent être les operateur << et >>.

Ceci dis, cette classe ne fait rien en soit. Tout le travail se situe dans chaque des classes que tu veux sérialiser (puisque pour les types de base comme int, float ou string, les stream savent déjà le faire).
Pour chacun de ses classes, il faudra que tu définisse l'opérateur << et >>.

Et à partir du moment où il sont défénis pour xhaque classe, à quoi sert la classe, FileOf<>, puisqu'on peut utiliser directement les fstream ???
0
Wani Messages postés 2 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 23 avril 2005
23 avril 2005 à 10:13
merci beaucoup SKZ et Kiroukou

Je vais analyser tout ca et pondre quelquechose :)

Petite remarque : j´insère des éléments de classe X dans mon fichier en les transformant en chaines de caractères et ceci avec une fonction :

char* ConversionChaine(const X& x);

Inversement quand je dois récupérer un élément j´ai une fonction inverse qui me restaure intacte toute donnée x traduite en chaine.
0
kiroukou Messages postés 22 Date d'inscription dimanche 16 janvier 2005 Statut Membre Dernière intervention 8 novembre 2005
21 avril 2005 à 06:50
Salut Wani :)
Oui je me suis amusé un peu avec tout ça.
Tu peux trouver les sources ici. Il reste des problemes je pense (des petits), le nom des classes est a changer au plus vite (je n'ai pas eu le choix pour mon tp ;)).

Si vous avez des remarques a me faire là dessus, je les prend avec plaisir :)

http://lesitekilestbien.free.fr/sources/Cpp_be6.zip
++
0
j'ai un probleme avec l'operateur char* et je ne sais pas comme faire la surcharge de l'operateur char*
0