PDA

Visualizza la versione completa : [C++] -Problemi con getline(cin, string)


stringestrai
25-01-2012, 23:10
Ho usato cerca ma non ho trovato nulla.
Sto creando un programma che dovrebbe inserire in un file.txt il nome della società, e in un altro i dettagli della società. Siccome nome e descrizione posso contenere spazi, ho dovuto usare getline(cin, stringa). L'unico problema è che mi salta il primo getline, ossia quello del nome società. Per di più, nel secondo getline non mi prende il prima carattere (se inserisco "agricola spa", in dati_societa.txt visualizzo "gricola spa"). Vi posto il codice così potete aiutarmi! Grazie

void inserisci()
{
ofstream newName, newDet;
newName.open("nomi_societa.txt", ios::out | ios::app);
newDet.open("dati_societa.txt", ios::out | ios::app);
string name, details;
cout << endl << "Inserisci il nome della nuova societa': ";
getline(cin, name);
cout << "Inserisci i dati della nuova societa': ";
getline(cin, details);
newName << name << "\n";
newDet << details << "\n";
cout << endl << "Scrittura eseguita con successo" << endl;
newName.close();
newDet.close();
}

MItaly
25-01-2012, 23:18
Il codice eseguito da sé non dà alcun problema. Per caso prima hai eseguito delle cin per leggere dei numeri?

stringestrai
25-01-2012, 23:25
Si ma in in un'altra procedura. Praticamente ho stampato a video un menu, ho fatto inserire il numero con cin (sarebbe la scelta) e poi uno switch che in base alla scelta fa eseguire procedure/funzioni diverse. Dici che è questo il problema? Come lo sistemo?
Grazie :)

MItaly
25-01-2012, 23:33
Il problema è che gli operatori di input formattato (i >>, in sostanza) lasciano il ritorno a capo finale nel buffer di lettura, ma per loro non è un problema, dato che alla successiva lettura ignorano automaticamente tutto il whitespace che incontrano prima dei caratteri "veri".

La getline, invece, fa parte della famiglia delle funzioni di output non formattato, che invece legge finché non trova il delimitatore, che nel tuo caso è il newline. Il problema è che nel buffer rimane questo newline "spurio" lasciato giù dalle letture precedenti con gli operatori >>.

La soluzione è svuotare il buffer subito dopo aver fatto le letture con i >>, cosa che si può fare facilmente con


cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');

istruzione che ignora tutti i caratteri rimasti nel buffer fino al primo newline (richiede #include <limits>).

stringestrai
26-01-2012, 15:45
Grazie mille Mitaly, ora funziona e non da problemi! :) Buona giornata!

Loading