OVH Cloud OVH Cloud

cin.get(string,int,OEF) et cin.getline(strng,int,EOF) : errreur

17 réponses
Avatar
heinquoi
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 X\Mes Programmes\VisualC++ 6\map2\mapmartinez.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 X\Mes Programmes\VisualC++ 6\map2\mapmartinez.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

10 réponses

1 2
Avatar
heinquoi
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* a écrit dans le message de
news:40c84d43$0$25503$
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




Avatar
Christophe de VIENNE

string nom;
string adr;
cin.get(nom, 25); // erreur ici
cin.getline(adr, 50, EOF); // erreur ici




<snip erreurs>

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


Avatar
Luc Hermitte
"heinquoi" <nospam* wrote in
news:40c84d43$0$25503$:

#include <strstream>


<sstream>, pas <strstream>

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>

Avatar
heinquoi
"Luc Hermitte" a écrit dans le message de
news:
"heinquoi" <nospam* wrote in
news:40c84d43$0$25503$:


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

Avatar
heinquoi
"Luc Hermitte" a écrit dans le message de
news:
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 ?


Avatar
drkm
"heinquoi" <nospam* writes:

std::getline me melange mes flux en entré

je l'ai utilisé comme ceci

<....>
^^^^^^


Qu'y a-t-il dans cette élipse ?

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

Avatar
Luc Hermitte
"heinquoi" <nospam* wrote in
news:40c875f3$0$13811$:

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>

Avatar
heinquoi
"Luc Hermitte" a écrit dans le message de
news:

Je soupçonne un
plusieurs d'ailleurs.

tout a fait... pourquoi ? Faut pas ?


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.
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

Avatar
Michel Michaud
Dans news:40c898ee$0$13821$,
"Luc Hermitte" a écrit dans le
message de news:
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
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
heinquoi
"Michel Michaud" a écrit dans le message de news:uY0yc.43735
$
Dans news:40c898ee$0$13821$,


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


"Luc Hermitte" a écrit dans le
message de news:
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
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/






1 2