Newsgroup: it.comp.lang.c++
Titolo: getline

Chi ha un po' di pazienza provi a vedere questi due programmi, uno di prova
(in cui getline mi funziona alla perfezione), l'altro in cui in esecuzione
il comando getline viene bellamente ignorato.
Ecco il programma di prova:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string pino;
cout << "Enter a sentence:\n";
getline(cin, pino);
cout << "You entered " << pino;
}
Ecco il segmento di codice in cui getline non vuole saperne di funzionare:
oggetto::oggetto()
{
cout << "Inserisci il tipo: ";
cin >> tipo;
cout << "Inserisci il nome: ";
cin >> nome;
cout << "Inserisci il commento: ";
getline(cin, commento);
}
Se avete una risposta, vi ringrazio!!!

Sicuramente rimangono dei dai nei buffer, li devi pulire o usi:
char newline;
cin >> newline;
dopo ogni input atteso
--------------------------------
Inviato via 
http://usenet.libero.it

La cin >> variabile, accetta una parola e termina con lo spazio...
quindi se inserisci due parole con uno spazio li considera due input, se ci
sono due get, ma se c'è una get e poi una getline funziona, ma tutto ciò che
si trova dopo lo spazio del primo cin viene eliminato


 wrote in message
HpFAa.71723$DN.16...@tornado.fastwebnet.it...

Eccomi. Sono sempre io. Innanzitutto una precisazione, non puoi usare la
getline definita in <string> nel compito d'esame poichè la <string>
appartiene alle ex-stl e queste non vanno a genio alla nostra amatissima
prof. Si può invece usare la getline di <iostream> che però funziona in modo
leggermente diverso.
tratto dalle MSDN
istream::getline
istream& getline( char* pch, int nCount, char delim = '\n' );
istream& getline( unsigned char* puch, int nCount, char delim = '\n' );
istream& getline( signed char* psch, int nCount, char delim = '\n' );
Parameters
pch, puch, psch
A pointer to a character array.
nCount
The maximum number of characters to store, including the terminating NULL.
delim
The delimiter character (defaults to newline).
Remarks
Extracts characters from the stream until either the delimiter delim is
found, the limit nCount-1 is reached, or end of file is reached. The
characters are stored in the specified array followed by a null terminator.
If the delimiter is found, it is extracted but not stored.
Come vedi è un metodo della classe iostream per cui devi fare delle chiamate
tipo
cin.getline(....)
dentro ci devi mettere una stringa C-like, e il numero massimo di caratteri
che questa può contenere, compreso il terminatore e il delimitatore se vuoi
che sia diverso da '\n'
Quindi la chiamata è di questo tipo:
const int MAX==260;
/*
non si possono inserire più di 250-260 caratteri in un input da consolle, ma
potresti dover modificare questo valore nel caso di input da file
*/
char stringa_C_like[MAX];
cin.getline(stringa_C_like, MAX);
mia_classe_stringa mia_stringa(stringa_C_like);
/*
ammesso che la tua classe stringa abbia un costruttore sovraccaricato che
accetti una stringa C-like
*/
A questo punto però il tuo problema non è risolto, infatti le cin che
precedono la getline hanno *letto* ma non *rimosso* il carattere
delimitatore '\n' percui lo devi cancellare, oppure la getline si limiterà a
leggere il delimitatore di fine riga senza leggere l'input successivo.
Per fare cio ci sono varie alternative, la prima che ti hanno proposto è
quella di leggere un singolo carattere che conterrà il carattere di fine
riga. Altrimenti c'è anche la possibilità, forse più elegante, di usare il
metodo ignore() (quel metodo di cui conoscevo l'esistenza ma di cui, in
classe, non mi veniva il nome).
tratto dalle MSDN
istream& ignore( int nCount = 1, int delim = EOF );
Parameters
nCount
The maximum number of characters to extract.
delim
The delimiter character (defaults to EOF).
Remarks
Extracts and discards up to nCount characters. Extraction stops if the
delimiter delim is extracted or the end of file is reached. If delim = EOF
(the default), then only the end of file condition causes termination. The
delimiter character is extracted.
E' sufficiente una chiamata del tipo
cin.ignore()
per eliminare il solo delimitatore di fine riga, se però il buffer è molto
sporco potresti aver bisogno di pulirlo del tutto con un
cin.ignore(MAX)
Questo funziona:
int main()
{
 Str a;
 char b[100];
 cin>>a;
 cout<<endl<<a<<endl;
 cin>>a;
 cout<<endl<<a<<endl;
 cin.ignore();
 cin.getline(b,100);
 a=b;
 cout<<endl<<a<<endl;
 return 0;
}
Ti suggerisco però di fare una funzione che incapsula sia la chiamata a
ignore che quella a getline e che restituisca per valore una istanza della
tua classe stringa, così non ti ritrovi tra i piedi la stringa C-like
Ciao


Ok, pulisco il buffer con ignore()

 Ok, pulisco il buffer con ignore()
Quoti in modo inacettabile!