PDA

View Full Version : get


Poix81
23-01-2002, 17:04
while(!cin.getline(Buffer,100))
{
cout << "Reinserire la stringa " << endl;
cout << "stringa : " ;
}

HO un problema, se inserisco da tastiera una serie di caratteri inferiore a 99 tutto funziona correttamente, ma se per caso ne inserisco 110, il programma va in loop e non mi lascia inserire più niente.

Bisogna "Resettare" il cin, oppure bisogna fare qualche altra strana cosa???

Grazie:eek:

cionci
23-01-2002, 18:17
Primo...la cin.getline ritorna una istream che è difficile che sia 0...

Secondo...se hai allocato 100 byte e te ce ne vai a mettere 110 è molto probabile che qualcosa smetta di funzionare...ed è per questo che va in loop...

Poix81
23-01-2002, 18:45
La volevo usare proprio nel caso in cui vengano inseriti troppi caratteri, così alloco più memoria e ne leggo di più.

Ma se la uso una sola volta, del tipo:

if (!cin.getline(Buffer,100))
cout << "Non e' stato possibile leggere la stringa";


Altrimenti c'è qualcosa del genere che mi permatte da leggere una stringa da tastiera senza avere il problema di perdere delle informazioni in questa operazione.

Ciao Grazie

cionci
23-01-2002, 19:13
Purtroppo no...
Devi fare in questo modo...

char tmp[101];
char *buffer = new char[100];
int i = 0;

do{

cin.getline(str, 100);

if(i>0)
{
char *tmp = buffer;
buffer = new char [(i+2)*100];
memcpy(buffer, tmp, (i+1)*100);
delete[] tmp;
}
memcpy(buffer+ i*100, str, 100);
++i;
}while (strlen(str) > 99);


Ricordati di fare in fondo alla funzione :

delete[] buffer;


E' un metodo molto brutto e che crea molta frammentazione dello heap...ma è l'unico (non l'ho verificato, l'ho scritto al volo)...

Poix81
23-01-2002, 20:12
Grazie 1000. Lo provo e ti so dire.

Ciao

/\/\@®¢Ø
23-01-2002, 21:05
Ciao !

Un modo molto semplice per fare quello che vuoi tu e' il semplice:

...
string s;
getline( cin , s );
const char* buf = s.c_str();

Se vuoi modificare il buffer o usarlo dopo la cancellazione della string devi copiartelo da qualche parte. Per fare questo al posto dell'ultima riga devi scrivere

char* buf = new char[ s.size() +1 ]; // occhio ! uno in piu' per lo '\0'
memcpy( buf, s.c_str() , s.size()+1 );


Oppure piu' semplice ancora utilizzi la string direttamente


P.S.:
Come ha giustamente fatto osservare cionci, il valore di ritorno di una getline e' lo stream ! Fare qualcosa del tipo
while( cin )
ha l'effetto che viene ritornato "true" se lo stream e' in buone condizioni , "false" altrimenti. Discorso opposto se usi
while ( !cin ) ed e' per questo che il tuo ciclo non finiva mai ( una volta che il canale e' guasto tale resta e quindi la condizione del tuo ciclo viene sempre soddisfatta ).

Ciao
Marco

Poix81
23-01-2002, 21:26
Grazie, cosi' ho risolto il mio problema.


Ciao

cionci
24-01-2002, 07:39
Me tapino ;) Alla STL non ci penso mai ! Eppure fanno comodo a volte (purtroppo eredità del C) :)