|
|
|
|
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
#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;
}
FileOf est une classe virtuelle pure
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 ); |
Salut, le operator>> return un &ostream et non un void
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;
}
tafiscobar "lou waye def bopame" la nullite n'existe pas, l'ignorance oui, ah je suppose!!! |
Merci à tous pour vos reponse :)
|
Bonjour,
|
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 ???
|
Salut Wani :)
|