PDA

Visualizza la versione completa : c++ lettura da standard input


c_junior
03-02-2010, 17:55
salve a tutti ho bisogno di una funzione che ogni volta che la chiama mi letta dallo standard buffer un determinato dato e lo metta in una determinata variabile di tipo char. Inoltre alla fine di ogni chiamata deve pulire il buffer di input e gestire eventuali errori del tipo quando si inserisce ctrl-z oppure quando il buffer è più lungo variabile di tipo char [] che lo deve contenere. Grazie
io avevo pensato a :


void read(istream &input,char message[],char dest[]){
cout<<message;
input.get(dest,17);
input.clear();
input.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}

però non da i risultati sperati, in particolare quando la lunghezza dello stream di input è superiore a dim. qualche idea?

MItaly
03-02-2010, 18:42
Non saprei, ma di sicuro non devi fare


input.clear();
input.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
così a caso, dal momento che, se la lettura è stata completata correttamente, questa linea fa sì che il programmi si blocchi ad aspettare una nuova linea di testo per poi ignorarla. Piuttosto fai:


if(!input)
{
input.clear();
input.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
. In ogni caso i problemi che si affrontano con questo approccio di svuotamento del buffer tendenzialmente sono determinati da un'impossibilità di convertire il testo inserito dall'utente nel tipo di dati richiesto, problema che non si pone qui visto che stai acquisendo una stringa.

Il mio consiglio comunque è di lasciare stare le stringhe C, almeno per l'input (danno più rogne che altro), e di utilizzare le stringhe C++ e la funzione getline. Per acquisire dati non di tipo stringa, invece, cerca nel forum la mia funzione template AcquireInput, che si occupa anche di ripulire lo stream e di chiedere nuovamente l'inserimento se qualcosa va storto.

c_junior
03-02-2010, 18:52
grazie

cmq non posso devo per forza usare le stringhe stile c

shodan
03-02-2010, 23:55
Come mai?

c_junior
04-02-2010, 11:57
eh abbiamo il professore fissato con le stringhe c! e il corso si chiama Fondamenti di programmazione con linguaggio di riferimento C++!!

@mitaly ho riguardato la funzione che ho postato e ho aggiunto l'if e sembra che funzioni

shodan
04-02-2010, 12:39
abbiamo il professore fissato con le stringhe c

Capisco. Peccato per lui che i linguaggi evolvano più rapidamente dei professori e il C++ sia tra questi.

MItaly
04-02-2010, 12:45
... va detto che le stringhe C, almeno all'inizio, sono didatticamente utili per far capire cosa ci sta sotto a tutte le varie classi-stringa. E poi puoi apprezzare la comodità delle varie std::string/CString/wxString/... solo dopo aver odiato per un po' le stringhe C. :D

shodan
04-02-2010, 12:48
Più o meno come camminare scalzi su un tappeto di chiodi ritti. Dopo averlo fatto per un po', si apprezzano le scarpe in acciaio.

c_junior
04-02-2010, 13:10
Originariamente inviato da MItaly odiato per un po' le stringhe C. :D
direi che li odierò a vita...

MItaly
04-02-2010, 13:30
Originariamente inviato da shodan
Più o meno come camminare scalzi su un tappeto di chiodi ritti. Dopo averlo fatto per un po', si apprezzano le scarpe in acciaio.
Esatto; tu non hai imparato a camminare così? :D

Loading