je redécouvre peut-être la roue, mais j'ai un problème pour
faire en C++ un truc que je savais bien faire en C.
Sur ma ligne de commande, soit l'utilisateur passe un nom
de fichier, et il faut lire dans ce fichier, soit il ne
dit rien, et on lit dans cin.
Mais comment faire ?
Je connais cin, fistream, mais entre le fait qu'on ne peut
pas copier de ostream, le RAII, la seule solution que
je vois, c'est de déclarer un pointeur
istream *in;
ce qui va être lourd à utiliser.
Il y a un truc ?
Merci,
Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin. [...]
Il y a un truc ?
rdbuf
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Boyer <Marc.Boyer@enseeiht.yahoo.fr.invalid> writes:
Sur ma ligne de commande, soit l'utilisateur passe un nom
de fichier, et il faut lire dans ce fichier, soit il ne
dit rien, et on lit dans cin.
[...]
Il y a un truc ?
rdbuf
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin. [...]
Il y a un truc ?
rdbuf
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Boyer
Le 10-02-2006, Jean-Marc Bourguet a écrit :
Marc Boyer writes:
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin. [...]
Il y a un truc ?
rdbuf
OK, merci, je regarde ça.
Marc Boyer -- Entre le fort et le faible, c'est la liberte qui opprime et le droit qui libere. Henri Lacordaire, Dominicain
Le 10-02-2006, Jean-Marc Bourguet <jm@bourguet.org> a écrit :
Marc Boyer <Marc.Boyer@enseeiht.yahoo.fr.invalid> writes:
Sur ma ligne de commande, soit l'utilisateur passe un nom
de fichier, et il faut lire dans ce fichier, soit il ne
dit rien, et on lit dans cin.
[...]
Il y a un truc ?
rdbuf
OK, merci, je regarde ça.
Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain
On Fri, 10 Feb 2006 16:35:38 +0000 (UTC), Marc Boyer :
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin.
int LeVraiMain (istream&);
int main (int argc, char** argv) { if (argc == 1) { LeVraiMain (cin); } else { LeVraiMain (ifstream (argv[1])); } }
Marc Boyer
Le 10-02-2006, Fabien LE LEZ a écrit :
On Fri, 10 Feb 2006 16:35:38 +0000 (UTC), Marc Boyer :
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin.
int LeVraiMain (istream&);
int main (int argc, char** argv) { if (argc == 1) { LeVraiMain (cin); } else { LeVraiMain (ifstream (argv[1])); } }
Sauf que ça passe pas vraiment à l'échelle: j'ai une fonction d'analyse des options, qui est un peu plus complexe, suivit de différents modules de traitement. Non, c'est le rdbuf (merci Jean-Marc et Google) qui fait exactement ce qu'il faut:
Il me reste juste à voir les questions d'appel de destructeur et de qui ferme le fichier.
Marc Boyer -- Entre le fort et le faible, c'est la liberte qui opprime et le droit qui libere. Henri Lacordaire, Dominicain
Le 10-02-2006, Fabien LE LEZ <gramster@gramster.com> a écrit :
On Fri, 10 Feb 2006 16:35:38 +0000 (UTC), Marc Boyer
<Marc.Boyer@enseeiht.yahoo.fr.invalid>:
Sur ma ligne de commande, soit l'utilisateur passe un nom
de fichier, et il faut lire dans ce fichier, soit il ne
dit rien, et on lit dans cin.
int LeVraiMain (istream&);
int main (int argc, char** argv)
{
if (argc == 1)
{
LeVraiMain (cin);
}
else
{
LeVraiMain (ifstream (argv[1]));
}
}
Sauf que ça passe pas vraiment à l'échelle: j'ai une fonction
d'analyse des options, qui est un peu plus complexe, suivit
de différents modules de traitement.
Non, c'est le rdbuf (merci Jean-Marc et Google) qui
fait exactement ce qu'il faut:
On Fri, 10 Feb 2006 16:35:38 +0000 (UTC), Marc Boyer :
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin.
int LeVraiMain (istream&);
int main (int argc, char** argv) { if (argc == 1) { LeVraiMain (cin); } else { LeVraiMain (ifstream (argv[1])); } }
Sauf que ça passe pas vraiment à l'échelle: j'ai une fonction d'analyse des options, qui est un peu plus complexe, suivit de différents modules de traitement. Non, c'est le rdbuf (merci Jean-Marc et Google) qui fait exactement ce qu'il faut:
Il me reste juste à voir les questions d'appel de destructeur et de qui ferme le fichier.
Le destructeur de fout.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Boyer <Marc.Boyer@enseeiht.yahoo.fr.invalid> writes:
Non, c'est le rdbuf (merci Jean-Marc et Google) qui
J'ai été un peu laconique mais j'ai préféré cela à te laisse
attendre.
Il me reste juste à voir les questions d'appel de destructeur
et de qui ferme le fichier.
Le destructeur de fout.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Il me reste juste à voir les questions d'appel de destructeur et de qui ferme le fichier.
Le destructeur de fout.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Boyer
Le 10-02-2006, Jean-Marc Bourguet a écrit :
Marc Boyer writes:
Non, c'est le rdbuf (merci Jean-Marc et Google) qui
J'ai été un peu laconique mais j'ai préféré cela à te laisse attendre.
C'est très bien. Pas la peine de perdre du temps à réexpliquer ce qui est déjà documenté partout ailleurs.
Il me reste juste à voir les questions d'appel de destructeur et de qui ferme le fichier.
Le destructeur de fout.
Ca c'est pas cool: je pensais encapsuler le traitement des options dans un sous-programme, mais le destructeur de fout fermera le fichier en sortie de la fonction. Je peux toujours faire une allocation dynamique, mais il faudra que je pense à le fermer ensuite.
Tu as un pointeur sur une doc précise sur le sujet ?
Marc Boyer -- Entre le fort et le faible, c'est la liberte qui opprime et le droit qui libere. Henri Lacordaire, Dominicain
Le 10-02-2006, Jean-Marc Bourguet <jm@bourguet.org> a écrit :
Marc Boyer <Marc.Boyer@enseeiht.yahoo.fr.invalid> writes:
Non, c'est le rdbuf (merci Jean-Marc et Google) qui
J'ai été un peu laconique mais j'ai préféré cela à te laisse
attendre.
C'est très bien. Pas la peine de perdre du temps à
réexpliquer ce qui est déjà documenté partout ailleurs.
Il me reste juste à voir les questions d'appel de destructeur
et de qui ferme le fichier.
Le destructeur de fout.
Ca c'est pas cool: je pensais encapsuler le traitement des options
dans un sous-programme, mais le destructeur de fout fermera le
fichier en sortie de la fonction.
Je peux toujours faire une allocation dynamique, mais il
faudra que je pense à le fermer ensuite.
Tu as un pointeur sur une doc précise sur le sujet ?
Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain
Il me reste juste à voir les questions d'appel de destructeur et de qui ferme le fichier.
Le destructeur de fout.
Ca c'est pas cool: je pensais encapsuler le traitement des options dans un sous-programme, mais le destructeur de fout fermera le fichier en sortie de la fonction. Je peux toujours faire une allocation dynamique, mais il faudra que je pense à le fermer ensuite.
Tu as un pointeur sur une doc précise sur le sujet ?
Marc Boyer -- Entre le fort et le faible, c'est la liberte qui opprime et le droit qui libere. Henri Lacordaire, Dominicain
Jean-Marc Bourguet
Marc Boyer writes:
Il me reste juste à voir les questions d'appel de destructeur et de qui ferme le fichier.
Le destructeur de fout.
Ca c'est pas cool: je pensais encapsuler le traitement des options dans un sous-programme, mais le destructeur de fout fermera le fichier en sortie de la fonction. Je peux toujours faire une allocation dynamique, mais il faudra que je pense à le fermer ensuite.
Tu as un pointeur sur une doc précise sur le sujet ?
Ma référence sur les IOStreams, c'est Langer&Kreft (Standard C++ IOStreams and Locales) et la norme.
Le rdbuf renvoyé par un fstream, c'est un pointeur vers un membre.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Boyer <Marc.Boyer@enseeiht.yahoo.fr.invalid> writes:
Il me reste juste à voir les questions d'appel de destructeur
et de qui ferme le fichier.
Le destructeur de fout.
Ca c'est pas cool: je pensais encapsuler le traitement des options
dans un sous-programme, mais le destructeur de fout fermera le
fichier en sortie de la fonction.
Je peux toujours faire une allocation dynamique, mais il
faudra que je pense à le fermer ensuite.
Tu as un pointeur sur une doc précise sur le sujet ?
Ma référence sur les IOStreams, c'est Langer&Kreft (Standard
C++ IOStreams and Locales) et la norme.
Le rdbuf renvoyé par un fstream, c'est un pointeur vers un
membre.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Il me reste juste à voir les questions d'appel de destructeur et de qui ferme le fichier.
Le destructeur de fout.
Ca c'est pas cool: je pensais encapsuler le traitement des options dans un sous-programme, mais le destructeur de fout fermera le fichier en sortie de la fonction. Je peux toujours faire une allocation dynamique, mais il faudra que je pense à le fermer ensuite.
Tu as un pointeur sur une doc précise sur le sujet ?
Ma référence sur les IOStreams, c'est Langer&Kreft (Standard C++ IOStreams and Locales) et la norme.
Le rdbuf renvoyé par un fstream, c'est un pointeur vers un membre.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
James Kanze
Marc Boyer wrote:
je redécouvre peut-être la roue, mais j'ai un problème pour faire en C++ un truc que je savais bien faire en C.
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin.
Mais comment faire ?
Je connais cin, fistream, mais entre le fait qu'on ne peut pas copier de ostream, le RAII, la seule solution que je vois, c'est de déclarer un pointeur istream *in; ce qui va être lourd à utiliser.
La solution habituelle, c'est quelque chose du genre :
if ( argc == 1 ) { process( std::cin ) ; } else { for ( int i = 1 ; i < argc ; ++ i ) { if ( strcmp( argv[ i ], "-" ) ) { process( std::cin ) ; } else { std::ifstream src( argv[ i ] ) ; if ( ! src ) { std::cerr << "Cannot open " << argv[ i ] << std::endl ; } else { process( src ) ; } } } }
Si (comme moi), tu utilises une classe pour parser la ligne de commande, la plus facile, c'est qu'elle se présente comme un std::vector avec les noms de fichiers, après avoir enlevé les options. Ensuite, tu fais comme ci-dessus, sauf avec ce vecteur, à la place de argv.
Enfin, si tu t'y connais avec les flux, ce n'est pas trop difficile d'écrire un flux qui fait le tous. Dans la pratique, mes programmes sont tous à peu près :
(Les options, ce sont des instances statiques des types qui dérivent de Gabi::Option. En tant qu'instances statiques, elles sont construites avant l'entrée en main. Et leur constructeur leur fait connaître à CommandLine.)
-- James Kanze Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Marc Boyer wrote:
je redécouvre peut-être la roue, mais j'ai un problème pour
faire en C++ un truc que je savais bien faire en C.
Sur ma ligne de commande, soit l'utilisateur passe un nom
de fichier, et il faut lire dans ce fichier, soit il ne
dit rien, et on lit dans cin.
Mais comment faire ?
Je connais cin, fistream, mais entre le fait qu'on ne peut pas
copier de ostream, le RAII, la seule solution que je vois,
c'est de déclarer un pointeur
istream *in;
ce qui va être lourd à utiliser.
La solution habituelle, c'est quelque chose du genre :
if ( argc == 1 ) {
process( std::cin ) ;
} else {
for ( int i = 1 ; i < argc ; ++ i ) {
if ( strcmp( argv[ i ], "-" ) ) {
process( std::cin ) ;
} else {
std::ifstream src( argv[ i ] ) ;
if ( ! src ) {
std::cerr << "Cannot open " << argv[ i ] << std::endl ;
} else {
process( src ) ;
}
}
}
}
Si (comme moi), tu utilises une classe pour parser la ligne de
commande, la plus facile, c'est qu'elle se présente comme un
std::vector avec les noms de fichiers, après avoir enlevé
les options. Ensuite, tu fais comme ci-dessus, sauf avec ce
vecteur, à la place de argv.
Enfin, si tu t'y connais avec les flux, ce n'est pas trop
difficile d'écrire un flux qui fait le tous. Dans la
pratique, mes programmes sont tous à peu près :
(Les options, ce sont des instances statiques des types qui
dérivent de Gabi::Option. En tant qu'instances statiques,
elles sont construites avant l'entrée en main. Et leur
constructeur leur fait connaître à CommandLine.)
--
James Kanze kanze.james@neuf.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
je redécouvre peut-être la roue, mais j'ai un problème pour faire en C++ un truc que je savais bien faire en C.
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin.
Mais comment faire ?
Je connais cin, fistream, mais entre le fait qu'on ne peut pas copier de ostream, le RAII, la seule solution que je vois, c'est de déclarer un pointeur istream *in; ce qui va être lourd à utiliser.
La solution habituelle, c'est quelque chose du genre :
if ( argc == 1 ) { process( std::cin ) ; } else { for ( int i = 1 ; i < argc ; ++ i ) { if ( strcmp( argv[ i ], "-" ) ) { process( std::cin ) ; } else { std::ifstream src( argv[ i ] ) ; if ( ! src ) { std::cerr << "Cannot open " << argv[ i ] << std::endl ; } else { process( src ) ; } } } }
Si (comme moi), tu utilises une classe pour parser la ligne de commande, la plus facile, c'est qu'elle se présente comme un std::vector avec les noms de fichiers, après avoir enlevé les options. Ensuite, tu fais comme ci-dessus, sauf avec ce vecteur, à la place de argv.
Enfin, si tu t'y connais avec les flux, ce n'est pas trop difficile d'écrire un flux qui fait le tous. Dans la pratique, mes programmes sont tous à peu près :
(Les options, ce sont des instances statiques des types qui dérivent de Gabi::Option. En tant qu'instances statiques, elles sont construites avant l'entrée en main. Et leur constructeur leur fait connaître à CommandLine.)
-- James Kanze Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Marc Boyer
Le 11-02-2006, Jean-Marc Bourguet a écrit :
Marc Boyer writes:
Il me reste juste à voir les questions d'appel de destructeur et de qui ferme le fichier.
Le destructeur de fout.
Ca c'est pas cool: je pensais encapsuler le traitement des options dans un sous-programme, mais le destructeur de fout fermera le fichier en sortie de la fonction. Je peux toujours faire une allocation dynamique, mais il faudra que je pense à le fermer ensuite.
Tu as un pointeur sur une doc précise sur le sujet ?
Ma référence sur les IOStreams, c'est Langer&Kreft (Standard C++ IOStreams and Locales)
Je me le mets sur ma liste de bouquins.
et la norme.
Là, j'hésite.
Le rdbuf renvoyé par un fstream, c'est un pointeur vers un membre.
Mais le dit membre pourrait avoir un champs interne qui lui dit qu'il est partagé, incrémenté à chaque appel à rdbuf( streambuf* ).
Ceci dit, quand deux fstream partagent le même streambuf, s'il n'y a pas de notion de partage, c'est le premier destructeur appelé qui ferme le flux.
Est-ce que cela signifie que le code suivant est correct, malgrès le non appel du destructeur de *ptr_file ?
ostream out; ofstream* ptr_file= new ofstream("toto.txt"); if (*ptr_file) { out.rdbuf( ptr_file->rdbuf() ); }
Marc Boyer -- Entre le fort et le faible, c'est la liberte qui opprime et le droit qui libere. Henri Lacordaire, Dominicain
Le 11-02-2006, Jean-Marc Bourguet <jm@bourguet.org> a écrit :
Marc Boyer <Marc.Boyer@enseeiht.yahoo.fr.invalid> writes:
Il me reste juste à voir les questions d'appel de destructeur
et de qui ferme le fichier.
Le destructeur de fout.
Ca c'est pas cool: je pensais encapsuler le traitement des options
dans un sous-programme, mais le destructeur de fout fermera le
fichier en sortie de la fonction.
Je peux toujours faire une allocation dynamique, mais il
faudra que je pense à le fermer ensuite.
Tu as un pointeur sur une doc précise sur le sujet ?
Ma référence sur les IOStreams, c'est Langer&Kreft (Standard
C++ IOStreams and Locales)
Je me le mets sur ma liste de bouquins.
et la norme.
Là, j'hésite.
Le rdbuf renvoyé par un fstream, c'est un pointeur vers un
membre.
Mais le dit membre pourrait avoir un champs interne
qui lui dit qu'il est partagé, incrémenté à chaque
appel à rdbuf( streambuf* ).
Ceci dit, quand deux fstream partagent le même
streambuf, s'il n'y a pas de notion de partage, c'est
le premier destructeur appelé qui ferme le flux.
Est-ce que cela signifie que le code suivant est correct,
malgrès le non appel du destructeur de *ptr_file ?
ostream out;
ofstream* ptr_file= new ofstream("toto.txt");
if (*ptr_file) {
out.rdbuf( ptr_file->rdbuf() );
}
Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain
Il me reste juste à voir les questions d'appel de destructeur et de qui ferme le fichier.
Le destructeur de fout.
Ca c'est pas cool: je pensais encapsuler le traitement des options dans un sous-programme, mais le destructeur de fout fermera le fichier en sortie de la fonction. Je peux toujours faire une allocation dynamique, mais il faudra que je pense à le fermer ensuite.
Tu as un pointeur sur une doc précise sur le sujet ?
Ma référence sur les IOStreams, c'est Langer&Kreft (Standard C++ IOStreams and Locales)
Je me le mets sur ma liste de bouquins.
et la norme.
Là, j'hésite.
Le rdbuf renvoyé par un fstream, c'est un pointeur vers un membre.
Mais le dit membre pourrait avoir un champs interne qui lui dit qu'il est partagé, incrémenté à chaque appel à rdbuf( streambuf* ).
Ceci dit, quand deux fstream partagent le même streambuf, s'il n'y a pas de notion de partage, c'est le premier destructeur appelé qui ferme le flux.
Est-ce que cela signifie que le code suivant est correct, malgrès le non appel du destructeur de *ptr_file ?
ostream out; ofstream* ptr_file= new ofstream("toto.txt"); if (*ptr_file) { out.rdbuf( ptr_file->rdbuf() ); }
Marc Boyer -- Entre le fort et le faible, c'est la liberte qui opprime et le droit qui libere. Henri Lacordaire, Dominicain
kanze
Jean-Marc Bourguet wrote:
Marc Boyer writes:
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin.
[...]
Il y a un truc ?
rdbuf
C'est curieux, mais je ne me suis jamais servi de rdbuf dans ce cas-là.
C'est peut-être parce que j'ai appris les iostream avec les iostream classiques ? Parce que Je suppose que tu parles de la version non-const de rdbuf, qui n'existait pas dans les iostream classiques (et qui serait plutôt mal nommé:-)).
Si on veut s'amuser à changer le streambuf de std::cin, il ne faut pas oublier qu'il faut le restorer avant le retour de main. Je verrais donc bien une classe RAII pour le faire, quelque chose du genre :
CInStreambufManager sbMgr ; // ... if ( nomDeFicherPresent ) { sbMgr.setFile( new filebuf( nomDeFichier, std::ios::in ) ) ; // setFile mémorise la valeur précédante de // std::cin.rdbuf(), afin de le restaurer dans son // destructeur. } // Travailler avec std::cin...
Mais je préfère de loin la solution MutliInputFileIStream. (Le code en serait normalement disponible à ma site. Si j'avais une site. Pour l'instant, je cherche encore un fournisseur qui marche.)
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jean-Marc Bourguet wrote:
Marc Boyer <Marc.Boyer@enseeiht.yahoo.fr.invalid> writes:
Sur ma ligne de commande, soit l'utilisateur passe un nom de
fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on
lit dans cin.
[...]
Il y a un truc ?
rdbuf
C'est curieux, mais je ne me suis jamais servi de rdbuf dans ce
cas-là.
C'est peut-être parce que j'ai appris les iostream avec les
iostream classiques ? Parce que Je suppose que tu parles de la
version non-const de rdbuf, qui n'existait pas dans les iostream
classiques (et qui serait plutôt mal nommé:-)).
Si on veut s'amuser à changer le streambuf de std::cin, il ne
faut pas oublier qu'il faut le restorer avant le retour de main.
Je verrais donc bien une classe RAII pour le faire, quelque
chose du genre :
CInStreambufManager sbMgr ;
// ...
if ( nomDeFicherPresent ) {
sbMgr.setFile( new filebuf( nomDeFichier, std::ios::in ) ) ;
// setFile mémorise la valeur précédante de
// std::cin.rdbuf(), afin de le restaurer dans son
// destructeur.
}
// Travailler avec std::cin...
Mais je préfère de loin la solution MutliInputFileIStream. (Le
code en serait normalement disponible à ma site. Si j'avais une
site. Pour l'instant, je cherche encore un fournisseur qui
marche.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Sur ma ligne de commande, soit l'utilisateur passe un nom de fichier, et il faut lire dans ce fichier, soit il ne dit rien, et on lit dans cin.
[...]
Il y a un truc ?
rdbuf
C'est curieux, mais je ne me suis jamais servi de rdbuf dans ce cas-là.
C'est peut-être parce que j'ai appris les iostream avec les iostream classiques ? Parce que Je suppose que tu parles de la version non-const de rdbuf, qui n'existait pas dans les iostream classiques (et qui serait plutôt mal nommé:-)).
Si on veut s'amuser à changer le streambuf de std::cin, il ne faut pas oublier qu'il faut le restorer avant le retour de main. Je verrais donc bien une classe RAII pour le faire, quelque chose du genre :
CInStreambufManager sbMgr ; // ... if ( nomDeFicherPresent ) { sbMgr.setFile( new filebuf( nomDeFichier, std::ios::in ) ) ; // setFile mémorise la valeur précédante de // std::cin.rdbuf(), afin de le restaurer dans son // destructeur. } // Travailler avec std::cin...
Mais je préfère de loin la solution MutliInputFileIStream. (Le code en serait normalement disponible à ma site. Si j'avais une site. Pour l'instant, je cherche encore un fournisseur qui marche.)
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34