Bonjour à tous,
Je patauge lamentablement avec les streams. J'ai beau chercher avec mon
ami
google et dans les archives du groupe, je ne parvient pas à en avoir une
vision clair.
A partir de la classe suivante:
class Test
{
public:
void put(const std::string& s);
void put(const char* buf, size_t buflen);
size_t get(std::string& s) const;
size_t get(char* buf) const;
};
Je voudrai créer une classe dérivée de ???stream pour pouvoir convertir
les
données
récupérées enregistrement par enregistrement de ma classe pour les
convertir
en flux et vice-versa.
Bonjour à tous,
Je patauge lamentablement avec les streams. J'ai beau chercher avec mon
ami
google et dans les archives du groupe, je ne parvient pas à en avoir une
vision clair.
A partir de la classe suivante:
class Test
{
public:
void put(const std::string& s);
void put(const char* buf, size_t buflen);
size_t get(std::string& s) const;
size_t get(char* buf) const;
};
Je voudrai créer une classe dérivée de ???stream pour pouvoir convertir
les
données
récupérées enregistrement par enregistrement de ma classe pour les
convertir
en flux et vice-versa.
Bonjour à tous,
Je patauge lamentablement avec les streams. J'ai beau chercher avec mon
ami
google et dans les archives du groupe, je ne parvient pas à en avoir une
vision clair.
A partir de la classe suivante:
class Test
{
public:
void put(const std::string& s);
void put(const char* buf, size_t buflen);
size_t get(std::string& s) const;
size_t get(char* buf) const;
};
Je voudrai créer une classe dérivée de ???stream pour pouvoir convertir
les
données
récupérées enregistrement par enregistrement de ma classe pour les
convertir
en flux et vice-versa.
Je voudrai créer une classe dérivée de ???stream pour pouvoir convertir
les données
récupérées enregistrement par enregistrement de ma classe pour les
convertir en flux et vice-versa.
Je voudrai créer une classe dérivée de ???stream pour pouvoir convertir
les données
récupérées enregistrement par enregistrement de ma classe pour les
convertir en flux et vice-versa.
Je voudrai créer une classe dérivée de ???stream pour pouvoir convertir
les données
récupérées enregistrement par enregistrement de ma classe pour les
convertir en flux et vice-versa.
La description de but correspond au rôle de formattage donné à l'operator
:
oprator<<( stream&, const Test&)
La description de but correspond au rôle de formattage donné à l'operator
:
oprator<<( stream&, const Test&)
La description de but correspond au rôle de formattage donné à l'operator
:
oprator<<( stream&, const Test&)
Ce que je voudrai, c'est dématérialiser le contenu de mes fichiers en flux
(suite d'enregistrement texte) pour pouvoir les convertir vers un autre
format dérivé de File ou même une autre classe sachant manipuler des flux
(genre une classe pour transferer les données via le réseau, une socket
quoi...)
Du coup j'imagine un truc ou je pourrai faire ce genre de choses:
FileFormat1 f1;
FileFormat2 f2;
FileStream fs1(f1);
FileStream fs2(f2);
fs1 << fs2; // copie de f2 dans f1 (au format définit par f1)
Socket sock;
SockStream ss(sock);
ss << fs1; // transfert de f1 sur la socket sock
fs2 << ss; // enregistrement des données de sock dans f2
PS: je n'utilise pas boost...
Ce que je voudrai, c'est dématérialiser le contenu de mes fichiers en flux
(suite d'enregistrement texte) pour pouvoir les convertir vers un autre
format dérivé de File ou même une autre classe sachant manipuler des flux
(genre une classe pour transferer les données via le réseau, une socket
quoi...)
Du coup j'imagine un truc ou je pourrai faire ce genre de choses:
FileFormat1 f1;
FileFormat2 f2;
FileStream fs1(f1);
FileStream fs2(f2);
fs1 << fs2; // copie de f2 dans f1 (au format définit par f1)
Socket sock;
SockStream ss(sock);
ss << fs1; // transfert de f1 sur la socket sock
fs2 << ss; // enregistrement des données de sock dans f2
PS: je n'utilise pas boost...
Ce que je voudrai, c'est dématérialiser le contenu de mes fichiers en flux
(suite d'enregistrement texte) pour pouvoir les convertir vers un autre
format dérivé de File ou même une autre classe sachant manipuler des flux
(genre une classe pour transferer les données via le réseau, une socket
quoi...)
Du coup j'imagine un truc ou je pourrai faire ce genre de choses:
FileFormat1 f1;
FileFormat2 f2;
FileStream fs1(f1);
FileStream fs2(f2);
fs1 << fs2; // copie de f2 dans f1 (au format définit par f1)
Socket sock;
SockStream ss(sock);
ss << fs1; // transfert de f1 sur la socket sock
fs2 << ss; // enregistrement des données de sock dans f2
PS: je n'utilise pas boost...
le Friday 20 August 2004 14:41, écrivit :
la philosophie C++ est de mettre au niveau stream la gestion du flux de
donnée elle même, pas la signification éventuelle que ça peut avoir. Un
stream n'a habituellement pas les moyens d'interpreter ce qu'il transmet..
(et donc ne peut pas le convertir vers une autre interpretation).
En gros, le stream est là pour encapsuler le média de transmission.
Son rôle n'est *pas* de définir un format de données.
Quand on écrit
MonObj monobj;
cout << monobj;
C'est pas le stream qui formatte, mais un opérateur de formattage
operator<< (stream&, Truc), qui combinent les services de locale à ceux
des
streams.
C'est ce qui justifie la classe stream, au dessus du streambuf.
un stream est formé
1.d'un streambuf (le flux lui même, avec uniquement des fonctions pour
envoyer/recevoir des octets, par blocs selon comme convient au media, et
éventuellement avancer/reculer si ça a un sens pour le media)
2. d'une annexe, avec une sorte de consigne (à bagages) où les
utilisateurs
du stream (i.e. les operator<<) peuvent stocker les paramètres dont ils
auront besoin au cours de l'utilisation du stream.
Ce système des streams C++ est bien fait, mais c'est vrai qu'on mets du
temps avant de comprendre comment tout ça s'empile, collabore avec locale,
et est censé s'utiliser. Avec cette métaphore de la consigne, j'espère que
tu cerneras le découpage subtile entre locale, stream, et streambuf plus
facilement..
En conclusion, dériver de stream ne sert donc que si c'est nécessaire pour
tirer profit d'un type de streambuf particulier. Pas à implémenter un
format de données différent..
Je te conseille plutôt de placer l'information de format au niveau des
classes des objets que tu vas faire passer dans tes streams.
(par exple, au niveau des operator<<(stream&, MaClasse) )
L'idiome classique pour copier un flux d'objets vers un autre est alors :
MaClasse obj;
stream1 >> obj;
stream2 << obj;
Si on ne sait pas quels objets sont dans le flux, alors il n'y rien
d'autre
à faire que transferer les octets bruts.
Ca devient donc un probleme de sérialization : on a une famille d'objets
qu'on veut pouvoir envoyer et récuperer dans un flux.
PS: je n'utilise pas boost...
ben c'est très dommage !
boost::serialization me semble la meilleure solution pour tes besoins.
le Friday 20 August 2004 14:41, fgourul.nospam@desysif.fr écrivit :
la philosophie C++ est de mettre au niveau stream la gestion du flux de
donnée elle même, pas la signification éventuelle que ça peut avoir. Un
stream n'a habituellement pas les moyens d'interpreter ce qu'il transmet..
(et donc ne peut pas le convertir vers une autre interpretation).
En gros, le stream est là pour encapsuler le média de transmission.
Son rôle n'est *pas* de définir un format de données.
Quand on écrit
MonObj monobj;
cout << monobj;
C'est pas le stream qui formatte, mais un opérateur de formattage
operator<< (stream&, Truc), qui combinent les services de locale à ceux
des
streams.
C'est ce qui justifie la classe stream, au dessus du streambuf.
un stream est formé
1.d'un streambuf (le flux lui même, avec uniquement des fonctions pour
envoyer/recevoir des octets, par blocs selon comme convient au media, et
éventuellement avancer/reculer si ça a un sens pour le media)
2. d'une annexe, avec une sorte de consigne (à bagages) où les
utilisateurs
du stream (i.e. les operator<<) peuvent stocker les paramètres dont ils
auront besoin au cours de l'utilisation du stream.
Ce système des streams C++ est bien fait, mais c'est vrai qu'on mets du
temps avant de comprendre comment tout ça s'empile, collabore avec locale,
et est censé s'utiliser. Avec cette métaphore de la consigne, j'espère que
tu cerneras le découpage subtile entre locale, stream, et streambuf plus
facilement..
En conclusion, dériver de stream ne sert donc que si c'est nécessaire pour
tirer profit d'un type de streambuf particulier. Pas à implémenter un
format de données différent..
Je te conseille plutôt de placer l'information de format au niveau des
classes des objets que tu vas faire passer dans tes streams.
(par exple, au niveau des operator<<(stream&, MaClasse) )
L'idiome classique pour copier un flux d'objets vers un autre est alors :
MaClasse obj;
stream1 >> obj;
stream2 << obj;
Si on ne sait pas quels objets sont dans le flux, alors il n'y rien
d'autre
à faire que transferer les octets bruts.
Ca devient donc un probleme de sérialization : on a une famille d'objets
qu'on veut pouvoir envoyer et récuperer dans un flux.
PS: je n'utilise pas boost...
ben c'est très dommage !
boost::serialization me semble la meilleure solution pour tes besoins.
le Friday 20 August 2004 14:41, écrivit :
la philosophie C++ est de mettre au niveau stream la gestion du flux de
donnée elle même, pas la signification éventuelle que ça peut avoir. Un
stream n'a habituellement pas les moyens d'interpreter ce qu'il transmet..
(et donc ne peut pas le convertir vers une autre interpretation).
En gros, le stream est là pour encapsuler le média de transmission.
Son rôle n'est *pas* de définir un format de données.
Quand on écrit
MonObj monobj;
cout << monobj;
C'est pas le stream qui formatte, mais un opérateur de formattage
operator<< (stream&, Truc), qui combinent les services de locale à ceux
des
streams.
C'est ce qui justifie la classe stream, au dessus du streambuf.
un stream est formé
1.d'un streambuf (le flux lui même, avec uniquement des fonctions pour
envoyer/recevoir des octets, par blocs selon comme convient au media, et
éventuellement avancer/reculer si ça a un sens pour le media)
2. d'une annexe, avec une sorte de consigne (à bagages) où les
utilisateurs
du stream (i.e. les operator<<) peuvent stocker les paramètres dont ils
auront besoin au cours de l'utilisation du stream.
Ce système des streams C++ est bien fait, mais c'est vrai qu'on mets du
temps avant de comprendre comment tout ça s'empile, collabore avec locale,
et est censé s'utiliser. Avec cette métaphore de la consigne, j'espère que
tu cerneras le découpage subtile entre locale, stream, et streambuf plus
facilement..
En conclusion, dériver de stream ne sert donc que si c'est nécessaire pour
tirer profit d'un type de streambuf particulier. Pas à implémenter un
format de données différent..
Je te conseille plutôt de placer l'information de format au niveau des
classes des objets que tu vas faire passer dans tes streams.
(par exple, au niveau des operator<<(stream&, MaClasse) )
L'idiome classique pour copier un flux d'objets vers un autre est alors :
MaClasse obj;
stream1 >> obj;
stream2 << obj;
Si on ne sait pas quels objets sont dans le flux, alors il n'y rien
d'autre
à faire que transferer les octets bruts.
Ca devient donc un probleme de sérialization : on a une famille d'objets
qu'on veut pouvoir envoyer et récuperer dans un flux.
PS: je n'utilise pas boost...
ben c'est très dommage !
boost::serialization me semble la meilleure solution pour tes besoins.
Frédéric Gourul a écrit dans le message :
cg47s9$uuh$Je patauge lamentablement avec les streams. J'ai beau chercher avec
mon ami google et dans les archives du groupe, je ne parvient pas à
en avoir une vision clair.
A partir de la classe suivante:
class Test
{
public:
void put(const std::string& s);
void put(const char* buf, size_t buflen);
size_t get(std::string& s) const;
size_t get(char* buf) const;
};
Je voudrai créer une classe dérivée de ???stream pour pouvoir
convertir les données récupérées enregistrement par enregistrement
de ma classe pour les convertir en flux et vice-versa.
quelque chose du genre ( inspiré d'explications de J. Kanze ) :
ATTENTION, Le code suivant n'est pas testé, et il s'appuie sur
filebuf, plutot que sur streambuf qui était demandé, mais l'idée reste
la même.
class testStream : public std::ios
^^^^^^^^
{
protected:
testStream() { }
public:
class sentry
{
public:
sentry(testStream& rts) : m_rTestStream(rts) { }
public:
operator bool() const
{
return !m_rTestStream.fail();
}
protected:
testStream& m_rTestStream;
}
protected:
std::filebuf m_filebuf;
};
class iTestStream : public testStream
{
};
class oTestStream : public testStream
{
public:
explicit oTestStream(const char* sNomFichier)
{
m_filebuf.open(sNomFichier,
ios_base::out|ios_base::trunc|ios_base::binary);
init(&m_filebuf);
}
};
Frédéric Gourul <fgourul.nospam@desysif.fr> a écrit dans le message :
cg47s9$uuh$1@news-reader5.wanadoo.fr...
Je patauge lamentablement avec les streams. J'ai beau chercher avec
mon ami google et dans les archives du groupe, je ne parvient pas à
en avoir une vision clair.
A partir de la classe suivante:
class Test
{
public:
void put(const std::string& s);
void put(const char* buf, size_t buflen);
size_t get(std::string& s) const;
size_t get(char* buf) const;
};
Je voudrai créer une classe dérivée de ???stream pour pouvoir
convertir les données récupérées enregistrement par enregistrement
de ma classe pour les convertir en flux et vice-versa.
quelque chose du genre ( inspiré d'explications de J. Kanze ) :
ATTENTION, Le code suivant n'est pas testé, et il s'appuie sur
filebuf, plutot que sur streambuf qui était demandé, mais l'idée reste
la même.
class testStream : public std::ios
^^^^^^^^
{
protected:
testStream() { }
public:
class sentry
{
public:
sentry(testStream& rts) : m_rTestStream(rts) { }
public:
operator bool() const
{
return !m_rTestStream.fail();
}
protected:
testStream& m_rTestStream;
}
protected:
std::filebuf m_filebuf;
};
class iTestStream : public testStream
{
};
class oTestStream : public testStream
{
public:
explicit oTestStream(const char* sNomFichier)
{
m_filebuf.open(sNomFichier,
ios_base::out|ios_base::trunc|ios_base::binary);
init(&m_filebuf);
}
};
Frédéric Gourul a écrit dans le message :
cg47s9$uuh$Je patauge lamentablement avec les streams. J'ai beau chercher avec
mon ami google et dans les archives du groupe, je ne parvient pas à
en avoir une vision clair.
A partir de la classe suivante:
class Test
{
public:
void put(const std::string& s);
void put(const char* buf, size_t buflen);
size_t get(std::string& s) const;
size_t get(char* buf) const;
};
Je voudrai créer une classe dérivée de ???stream pour pouvoir
convertir les données récupérées enregistrement par enregistrement
de ma classe pour les convertir en flux et vice-versa.
quelque chose du genre ( inspiré d'explications de J. Kanze ) :
ATTENTION, Le code suivant n'est pas testé, et il s'appuie sur
filebuf, plutot que sur streambuf qui était demandé, mais l'idée reste
la même.
class testStream : public std::ios
^^^^^^^^
{
protected:
testStream() { }
public:
class sentry
{
public:
sentry(testStream& rts) : m_rTestStream(rts) { }
public:
operator bool() const
{
return !m_rTestStream.fail();
}
protected:
testStream& m_rTestStream;
}
protected:
std::filebuf m_filebuf;
};
class iTestStream : public testStream
{
};
class oTestStream : public testStream
{
public:
explicit oTestStream(const char* sNomFichier)
{
m_filebuf.open(sNomFichier,
ios_base::out|ios_base::trunc|ios_base::binary);
init(&m_filebuf);
}
};
En conclusion, dériver de stream ne sert donc que si c'est nécessaire
pour tirer profit d'un type de streambuf particulier. Pas à implémenter
un format de données différent..
ben justement, je voudrai utiliser un streambuf déja existant, le truc qui
me gererait la transmission/récupération des octets sur le flux et
appellerai les fonctions get/put des mes objets fichiers uniquement
lorsque le tampon est vide/plein.
En conclusion, dériver de stream ne sert donc que si c'est nécessaire
pour tirer profit d'un type de streambuf particulier. Pas à implémenter
un format de données différent..
ben justement, je voudrai utiliser un streambuf déja existant, le truc qui
me gererait la transmission/récupération des octets sur le flux et
appellerai les fonctions get/put des mes objets fichiers uniquement
lorsque le tampon est vide/plein.
En conclusion, dériver de stream ne sert donc que si c'est nécessaire
pour tirer profit d'un type de streambuf particulier. Pas à implémenter
un format de données différent..
ben justement, je voudrai utiliser un streambuf déja existant, le truc qui
me gererait la transmission/récupération des octets sur le flux et
appellerai les fonctions get/put des mes objets fichiers uniquement
lorsque le tampon est vide/plein.
En conclusion, dériver de stream ne sert donc que si c'est nécessaire
pour tirer profit d'un type de streambuf particulier. Pas à implémenter
un format de données différent..
ben justement, je voudrai utiliser un streambuf déja existant, le truc qui
me gererait la transmission/récupération des octets sur le flux et
appellerai les fonctions get/put des mes objets fichiers uniquement
lorsque le tampon est vide/plein.
En conclusion, dériver de stream ne sert donc que si c'est nécessaire
pour tirer profit d'un type de streambuf particulier. Pas à implémenter
un format de données différent..
ben justement, je voudrai utiliser un streambuf déja existant, le truc qui
me gererait la transmission/récupération des octets sur le flux et
appellerai les fonctions get/put des mes objets fichiers uniquement
lorsque le tampon est vide/plein.
En conclusion, dériver de stream ne sert donc que si c'est nécessaire
pour tirer profit d'un type de streambuf particulier. Pas à implémenter
un format de données différent..
ben justement, je voudrai utiliser un streambuf déja existant, le truc qui
me gererait la transmission/récupération des octets sur le flux et
appellerai les fonctions get/put des mes objets fichiers uniquement
lorsque le tampon est vide/plein.
.
.
.
Je ne suis toujours pas sûr d'avoir compris. Ces formats, est-ce qu'ils
encodent les mêmes choses, ou est-ce qu'ils sont vraiment indépendants
les uns des autres. Et quel rapport est-ce qu'ils ont avec le texte --
je vois bien ce genre de chose avec, par exemple, des images (qui
peuvent être en gif, jpeg, etc.), mais alors, je ne vois pas où une
représentation texte y entre.
Mais ça, c'est tout à fait autre chose. Un SockStream, typiquement, se
baserait sur istream et ostream pour le formattage ; en fait,
typiquement, tout ce qu'il ajoutera à istream et ostream (dont il
dérivera), ce sont des constructeurs et des destructeurs propre à créer
et à détruire le streambuf qu'il faut (un SockStreamBuf). Toute la
spécialisation pour faire des entrées/sorties sur socket, plutôt que sur
fichier, se trouveront dans le streambuf. Et tout le formattage
s'effectuera dans istream et ostream, sans savoir en fait que la source
ou la destination est un socket.
|> PS: je n'utilise pas boost...
Est-ce que tu pourrais ? Parce que si la solution y existe, c'est bien
plus facile à utiliser quelque chose d'existant que de réinventer la
roue.
Je ne suis toujours pas sûr d'avoir compris. Ces formats, est-ce qu'ils
encodent les mêmes choses, ou est-ce qu'ils sont vraiment indépendants
les uns des autres. Et quel rapport est-ce qu'ils ont avec le texte --
je vois bien ce genre de chose avec, par exemple, des images (qui
peuvent être en gif, jpeg, etc.), mais alors, je ne vois pas où une
représentation texte y entre.
Mais ça, c'est tout à fait autre chose. Un SockStream, typiquement, se
baserait sur istream et ostream pour le formattage ; en fait,
typiquement, tout ce qu'il ajoutera à istream et ostream (dont il
dérivera), ce sont des constructeurs et des destructeurs propre à créer
et à détruire le streambuf qu'il faut (un SockStreamBuf). Toute la
spécialisation pour faire des entrées/sorties sur socket, plutôt que sur
fichier, se trouveront dans le streambuf. Et tout le formattage
s'effectuera dans istream et ostream, sans savoir en fait que la source
ou la destination est un socket.
|> PS: je n'utilise pas boost...
Est-ce que tu pourrais ? Parce que si la solution y existe, c'est bien
plus facile à utiliser quelque chose d'existant que de réinventer la
roue.
Je ne suis toujours pas sûr d'avoir compris. Ces formats, est-ce qu'ils
encodent les mêmes choses, ou est-ce qu'ils sont vraiment indépendants
les uns des autres. Et quel rapport est-ce qu'ils ont avec le texte --
je vois bien ce genre de chose avec, par exemple, des images (qui
peuvent être en gif, jpeg, etc.), mais alors, je ne vois pas où une
représentation texte y entre.
Mais ça, c'est tout à fait autre chose. Un SockStream, typiquement, se
baserait sur istream et ostream pour le formattage ; en fait,
typiquement, tout ce qu'il ajoutera à istream et ostream (dont il
dérivera), ce sont des constructeurs et des destructeurs propre à créer
et à détruire le streambuf qu'il faut (un SockStreamBuf). Toute la
spécialisation pour faire des entrées/sorties sur socket, plutôt que sur
fichier, se trouveront dans le streambuf. Et tout le formattage
s'effectuera dans istream et ostream, sans savoir en fait que la source
ou la destination est un socket.
|> PS: je n'utilise pas boost...
Est-ce que tu pourrais ? Parce que si la solution y existe, c'est bien
plus facile à utiliser quelque chose d'existant que de réinventer la
roue.