 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
heinquoi Guest
|
Posted: Thu Jun 10, 2004 12:01 pm Post subject: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : errr |
|
|
bjr,
j'ai un petit prog qui ne fonctionne pas et je ne comprend pas bien
l'erreur:
// Variables
#include <string>
#include <iostream>
#include <map>
#include <fstream>
//#include <stdcomp>
#include <strstream>
#include "client.hpp"
<........>
string nom;
string adr;
cin.get(nom, 25); // erreur ici
cin.getline(adr, 50, EOF); // erreur ici
Avec le message d'erreur suivant:
:X Mes Documents XMes ProgrammesVisualC++ 6map2mapmartinez.cpp(163):
error: no instance of overloaded function "std::basic_istream<_E, _Tr>::get
[with _E=char, _Tr=std::char_traits<char>]" matches the argument list
argument types are: (std::string, int)
object type is: std::istream
cin.get(nom, 25);
^
D:X Mes Documents XMes ProgrammesVisualC++ 6map2mapmartinez.cpp(168):
error: no instance of overloaded function "std::basic_istream<_E,
_Tr>::getline [with _E=char, _Tr=std::char_traits<char>]" matches the
argument list
argument types are: (std::string, int, int)
object type is: std::istream
cin.getline(adr, 50, EOF);
^
Or cin.get et cin.getline sont 2 fonctions qui existe et qui prennent bien
les arguments (char*, int, int)...
Un truc m'echappe....probablememnt un petit truc !
Merci d'avance de votre aide
Cordialement
H
|
|
| Back to top |
|
 |
heinquoi Guest
|
Posted: Thu Jun 10, 2004 12:13 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
J'ai oublier de vous preciser qu'il y a dans le code un using namespace std;
pour ceux qui me prendrait pour plus debutant que je ne suis.
"heinquoi" <nospam*heinquoi1 (AT) libertysurf (DOT) fr> a écrit dans le message de
news:40c84d43$0$25503$626a14ce (AT) news (DOT) free.fr...
| Quote: | bjr,
j'ai un petit prog qui ne fonctionne pas et je ne comprend pas bien
l'erreur:
// Variables
#include <string
#include
#include
#include
//#include
#include
#include "client.hpp"
........
string nom;
string adr;
cin.get(nom, 25); // erreur ici
cin.getline(adr, 50, EOF); // erreur ici
Avec le message d'erreur suivant:
:X Mes Documents XMes ProgrammesVisualC++ 6map2mapmartinez.cpp(163):
error: no instance of overloaded function "std::basic_istream<_E,
_Tr>::get
[with _E=char, _Tr=std::char_traits<char>]" matches the argument list
argument types are: (std::string, int)
object type is: std::istream
cin.get(nom, 25);
^
D:X Mes Documents XMes ProgrammesVisualC++ 6map2mapmartinez.cpp(168):
error: no instance of overloaded function "std::basic_istream<_E,
_Tr>::getline [with _E=char, _Tr=std::char_traits<char>]" matches the
argument list
argument types are: (std::string, int, int)
object type is: std::istream
cin.getline(adr, 50, EOF);
^
Or cin.get et cin.getline sont 2 fonctions qui existe et qui prennent bien
les arguments (char*, int, int)...
Un truc m'echappe....probablememnt un petit truc !
Merci d'avance de votre aide
Cordialement
H
|
|
|
| Back to top |
|
 |
Christophe de VIENNE Guest
|
Posted: Thu Jun 10, 2004 12:28 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
heinquoi a écrit :
| Quote: |
string nom;
string adr;
cin.get(nom, 25); // erreur ici
cin.getline(adr, 50, EOF); // erreur ici
|
<snip erreurs>
| Quote: | Or cin.get et cin.getline sont 2 fonctions qui existe et qui prennent bien
les arguments (char*, int, int)...
|
nom et adr sont des std::string, pas des char*. Rien de surprenant donc.
Regarde du côté de std::getline :
#include <string>
#include <iostream>
int main()
{
std::string buffer;
std::getline(std::cin, buffer);
}
A+
Christophe
--
Christophe de Vienne
|
|
| Back to top |
|
 |
Luc Hermitte Guest
|
Posted: Thu Jun 10, 2004 12:34 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
"heinquoi" <nospam*heinquoi1 (AT) libertysurf (DOT) fr> wrote in
news:40c84d43$0$25503$626a14ce (AT) news (DOT) free.fr:
| Quote: | #include <strstream
|
| Quote: | Or cin.get et cin.getline sont 2 fonctions qui existe et qui prennent
bien les arguments (char*, int, int)...
Un truc m'echappe....probablememnt un petit truc !
|
Comme le fait que std::string n'est pas un char * ?
^_^
Sinon, préfère std::getline(std::cin, chaine) à cin.getline(buffer,
taille_max).
--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>
|
|
| Back to top |
|
 |
heinquoi Guest
|
Posted: Thu Jun 10, 2004 2:17 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
"Luc Hermitte" <hermitte (AT) free (DOT) fr.invalid> a écrit dans le message de
news:Xns9504943B59F00isyfur (AT) 127 (DOT) 0.0.1...
| Quote: | "heinquoi" <nospam*heinquoi1 (AT) libertysurf (DOT) fr> wrote in
news:40c84d43$0$25503$626a14ce (AT) news (DOT) free.fr:
Comme le fait que std::string n'est pas un char * ?
^_^
Sinon, préfère std::getline(std::cin, chaine) à cin.getline(buffer,
taille_max).
|
effictivement, ...je me la suis joué bourrin la dessus.
Merci bien à tous
H
|
|
| Back to top |
|
 |
heinquoi Guest
|
Posted: Thu Jun 10, 2004 2:55 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
| Quote: | "Luc Hermitte" <hermitte (AT) free (DOT) fr.invalid> a écrit dans le message de
news:Xns9504943B59F00isyfur (AT) 127 (DOT) 0.0.1...
Sinon, préfère std::getline(std::cin, chaine) à cin.getline(buffer,
taille_max).
std::getline me melange mes flux en entré |
je l'ai utilisé comme ceci
<....>
std::string nom;
std::string adr;
std::cout << "epogkop";
std::getline ( cin, nom);
std::cout << "ndjfpiji";
std::getline(cin,adr);
<...>
je rentre Mon nom au premenier getline et au lieu d'apparaitre dans nom, il
apparait dans adresse
Il semble que cela produise un débordement, et ca me nique toute les autres
entrées ( par cin) du programme:
le programme marche tout seul sans que j'ai a mettre des entrées dans les
differents cin... Puis s'arrete, comme si il avait vidé un buffer d'avance.
Une idée ?
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Thu Jun 10, 2004 3:17 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
"heinquoi" <nospam*heinquoi1 (AT) libertysurf (DOT) fr> writes:
| Quote: | std::getline me melange mes flux en entré
je l'ai utilisé comme ceci
....
^^^^^^ |
Qu'y a-t-il dans cette élipse ?
| Quote: | std::string nom;
std::string adr;
std::cout << "epogkop";
std::getline ( cin, nom);
std::cout << "ndjfpiji";
std::getline(cin,adr);
...
je rentre Mon nom au premenier getline et au lieu d'apparaitre dans nom, il
apparait dans adresse
Il semble que cela produise un débordement, et ca me nique toute les autres
entrées ( par cin) du programme:
le programme marche tout seul sans que j'ai a mettre des entrées dans les
differents cin... Puis s'arrete, comme si il avait vidé un buffer d'avance.
Une idée ?
|
Traîne-t-il des lignes dans `cin' ? Quelque chose comme
stc::cin.ignore( std::numeric_limits< int >::max() , 'n' ) ;
change-t-il quelque chose ? Et en sortant `std::endl' à la fin de
chaque prompt ?
--drkm
|
|
| Back to top |
|
 |
Luc Hermitte Guest
|
Posted: Thu Jun 10, 2004 3:19 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
"heinquoi" <nospam*heinquoi1 (AT) libertysurf (DOT) fr> wrote in
news:40c875f3$0$13811$626a14ce (AT) news (DOT) free.fr:
| Quote: | std::getline me melange mes flux en entré
je l'ai utilisé comme ceci
....
std::string nom;
std::string adr;
std::cout << "epogkop";
std::getline ( cin, nom);
std::cout << "ndjfpiji";
std::getline(cin,adr);
...
je rentre Mon nom au premenier getline et au lieu d'apparaitre dans
nom, il apparait dans adresse
Il semble que cela produise un débordement, et ca me nique toute les
autres entrées ( par cin) du programme:
le programme marche tout seul sans que j'ai a mettre des entrées dans
les differents cin... Puis s'arrete, comme si il avait vidé un buffer
d'avance. Une idée ?
|
Je soupçonne un
std::cin >> toto;
dans le <....>
Dans ce cas, il faut purger la ligne si elle n'est pas censée contenir
quoique ce soit d'autre. Si je me souviens bien, cela ce règle par un :
std::cin.ignore(std::numeric_limits<int>::max(),'n');
avant le getline.
--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>
|
|
| Back to top |
|
 |
heinquoi Guest
|
Posted: Thu Jun 10, 2004 5:24 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
"Luc Hermitte" <hermitte (AT) free (DOT) fr.invalid> a écrit dans le message de
news:Xns9504B03E2927Bisyfur (AT) 127 (DOT) 0.0.1...
| Quote: |
Je soupçonne un
plusieurs d'ailleurs. |
tout a fait... pourquoi ? Faut pas ?
| Quote: | std::cin >> toto;
dans le <....
Dans ce cas, il faut purger la ligne si elle n'est pas censée contenir
quoique ce soit d'autre. Si je me souviens bien, cela ce règle par un :
std::cin.ignore(std::numeric_limits
avant le getline.
Oui ca règle ...mais ca amène un autre probleme: |
je met un cin.ignore (80) avant et apres chaque getline (cin.....)
j'ai essayé aussi uniquement apres, j'ai essayé aussi cin.ignore(5,'n'), ou
cin.ignore(8,EOF) .... a peu pres pareil plus ou moins fort. Cad, que le
programme attent autand de 'enter' ou a peu pres que de x dans cin.ignore(x)
avant de continuer son deroulement normale.
jutilise aussi les flux pour une sauvegarde fichier et j'utilise aussi ...
getline...
pour conclure, c'est mieux, mais c'est pas encore le top .
--
Cordialement,
Heinquoi
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Thu Jun 10, 2004 5:34 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
Dans news:40c898ee$0$13821$626a14ce (AT) news (DOT) free.fr,
heinquoi <nospam*heinquoi1 (AT) libertysurf (DOT) fr> a écrit :
| Quote: | "Luc Hermitte" <hermitte (AT) free (DOT) fr.invalid> a écrit dans le
message de news:Xns9504B03E2927Bisyfur (AT) 127 (DOT) 0.0.1...
std::cin.ignore(std::numeric_limits<int>::max(),'n');
avant le getline.
Oui ca règle ...mais ca amène un autre probleme:
je met un cin.ignore (80) avant et apres chaque getline
(cin.....)
|
La logique de base qui fonctionne si tu veux être consistant et
lire directement les valeurs numériques avec >> (ce qui n'est pas
très solide) est de faire un ignore APRÈS chaque lecture avec >>
et pas après getline. En fait, l'idée est de ne jamais laisser
le délimiteur dans la zone tampon (>> le laisse, getline non).
Donc si tu lis avec >>, tu fais ensuite un ignore pour lire le
délimiteur. En fait, si tu ne veux pas valider les lectures
sérieusement, donc si tu supposes que les données sont bonnes, tu
peux faire un simple flux.ignore() (qui saute un seul caractère)
pour lire le délimiteur. Faire un ignore jusqu'à n, en pensant
qu'il y aura d'autres choses avant mais qu'on ne veut pas s'en
préoccuper, ce n'est pas vraiment une solution « supérieure » !
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
heinquoi Guest
|
Posted: Thu Jun 10, 2004 6:53 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
"Michel Michaud" <mm (AT) gdzid (DOT) com> a écrit dans le message de news:uY0yc.43735
$sS2.1562611 (AT) news20 (DOT) bellglobal.com...
| Quote: | Dans news:40c898ee$0$13821$626a14ce (AT) news (DOT) free.fr,
|
j'ai vu que tu as ecrit 2 livres et un troisieme est en preparation. Le
3eme m'interesse particulièrement.
Structures de données et algothmes en iso c++.
l'as tu terminé ?
de plus sache que, d'apres ton sommaire cela correspond tout a fait, a une
unite de valeur du diplome BAC+2 informatique d'entreprise du CNAM orleans
(que je passe cette année)
--
Cordialement,
Heinquoi
| Quote: | heinquoi <nospam*heinquoi1 (AT) libertysurf (DOT) fr> a écrit :
"Luc Hermitte" <hermitte (AT) free (DOT) fr.invalid> a écrit dans le
message de news:Xns9504B03E2927Bisyfur (AT) 127 (DOT) 0.0.1...
std::cin.ignore(std::numeric_limits<int>::max(),'n');
avant le getline.
Oui ca règle ...mais ca amène un autre probleme:
je met un cin.ignore (80) avant et apres chaque getline
(cin.....)
La logique de base qui fonctionne si tu veux être consistant et
lire directement les valeurs numériques avec >> (ce qui n'est pas
très solide) est de faire un ignore APRÈS chaque lecture avec
et pas après getline. En fait, l'idée est de ne jamais laisser
le délimiteur dans la zone tampon (>> le laisse, getline non).
Donc si tu lis avec >>, tu fais ensuite un ignore pour lire le
délimiteur. En fait, si tu ne veux pas valider les lectures
sérieusement, donc si tu supposes que les données sont bonnes, tu
peux faire un simple flux.ignore() (qui saute un seul caractère)
pour lire le délimiteur. Faire un ignore jusqu'à n, en pensant
qu'il y aura d'autres choses avant mais qu'on ne veut pas s'en
préoccuper, ce n'est pas vraiment une solution « supérieure » !
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Fri Jun 11, 2004 4:12 am Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
Dans news:40c8adad$0$13812$626a14ce (AT) news (DOT) free.fr,
heinquoi <nospam*heinquoi1 (AT) libertysurf (DOT) fr> a écrit :
| Quote: | j'ai vu que tu as ecrit 2 livres et un troisieme est en
preparation. Le 3eme m'interesse particulièrement.
Structures de données et algothmes en iso c++.
l'as tu terminé ?
|
En fait, j'en ai écrit et fini deux, que j'ai refondus et
retravaillés pour en faire un nouveau que je suis en train de
terminer ainsi que le troisième (quatrième ?) qui est déjà
distribué de façon limitée. J'espère finir les deux dans les
semaines qui viennent, pour qu'ils soient disponibles à la fin
de l'été, au Québec à tout le moins (je ne sais plus comment se
fait la distribution ailleurs).
| Quote: | de plus sache que, d'apres ton sommaire cela correspond tout a
fait, a une unite de valeur du diplome BAC+2 informatique
d'entreprise du CNAM orleans (que je passe cette année)
|
Tant mieux si ça apporte des ventes C'est sûr que c'est un
contenu classique, mais mon livre est très différent de ce que
je connais sur le sujet, visant plus la pratique que la théorie
en étant aussi très spécifique sur les possibilités de ISO C++.
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Jun 11, 2004 7:59 am Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
"Michel Michaud" <mm (AT) gdzid (DOT) com> wrote
| Quote: | Dans news:40c898ee$0$13821$626a14ce (AT) news (DOT) free.fr,
heinquoi <nospam*heinquoi1 (AT) libertysurf (DOT) fr> a écrit :
"Luc Hermitte" <hermitte (AT) free (DOT) fr.invalid> a écrit dans le
message de news:Xns9504B03E2927Bisyfur (AT) 127 (DOT) 0.0.1...
std::cin.ignore(std::numeric_limits<int>::max(),'n');
avant le getline.
Oui ca règle ...mais ca amène un autre probleme: je met un
cin.ignore (80) avant et apres chaque getline (cin.....)
La logique de base qui fonctionne si tu veux être consistant et lire
directement les valeurs numériques avec >> (ce qui n'est pas très
solide) est de faire un ignore APRÈS chaque lecture avec >> et pas
après getline. En fait, l'idée est de ne jamais laisser le délimiteur
dans la zone tampon (>> le laisse, getline non).
Donc si tu lis avec >>, tu fais ensuite un ignore pour lire le
délimiteur. En fait, si tu ne veux pas valider les lectures
sérieusement, donc si tu supposes que les données sont bonnes, tu peux
faire un simple flux.ignore() (qui saute un seul caractère) pour lire
le délimiteur. Faire un ignore jusqu'à n, en pensant qu'il y aura
d'autres choses avant mais qu'on ne veut pas s'en préoccuper, ce n'est
pas vraiment une solution « supérieure » !
|
En général, je le trouve préférable à ne pas mélanger les lectures
orientées ligne et les lectures orientées champs. Si la syntaxe de ce
qu'on lit, c'est orientée ligne, je préfère ne lire que des lignes,
quitte à utiliser un istringstream pour les analyser par la suite.
--
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
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Fri Jun 11, 2004 11:37 am Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:
| Quote: | En général, je le trouve préférable à ne pas mélanger les lectures
orientées ligne et les lectures orientées champs.
|
Tu veux dire champs de longueur fixe ? Parceque, sinon, je ne vois
pas vraiment la différence. Les lignes sont des champs de longueur
variable, et de dilimiteur 'n'. Non ?
--drkm
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Fri Jun 11, 2004 1:11 pm Post subject: Re: cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : |
|
|
Dans news:d6652001.0406102359.40c19ae2 (AT) posting (DOT) google.com,
[email]kanze (AT) gabi-soft (DOT) fr[/email] <kanze (AT) gabi-soft (DOT) fr> a écrit :
| Quote: | "Michel Michaud" <mm (AT) gdzid (DOT) com> wrote in message
news:<uY0yc.43735$sS2.1562611 (AT) news20 (DOT) bellglobal.com>...
En général, je le trouve préférable à ne pas mélanger les
lectures orientées ligne et les lectures orientées champs. Si
la syntaxe de ce qu'on lit, c'est orientée ligne, je préfère ne
lire que des lignes, quitte à utiliser un istringstream pour
les analyser par la suite.
|
En fait, même (ou surtout) si la ligne contient plusieurs champs,
la façon la plus sûre est de lire la ligne au complet et de
l'analyser ensuite. Mais si l'on suppose qu'il n'y a pas d'erreurs
ou qu'on ne veut pas les vérifier, on peut voir getline comme un
version particulière de >>...
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|