PDA

Visualizza la versione completa : [C] fflush(stdin) teoria


Satiro88
25-10-2013, 18:31
Ciao a tutti,mi è capitato spesso di avere problemi con i caratteri finché non ho scoperto di poter utilizzare questa funzione. Sulle mie slide di informatica non è riportata nessuna spiegazione a riguardo e fatico a trovare qualcosa di comprensibile in internet. Mi piacerebbe capire grosso modo come funziona.So solo che permette la "pulitura" del buffer di input,ma non so cosa si intenda ne per pulitura ne per buffer di input(mi pare di aver capito che si tratti di una zona di memoria che contiene tutti gli inserimenti,gli input).
Inoltre,come è possibile che se inserisco un carattere e faccio fflush(stdin) questi non mi cancelli anche il carattere?

Mi è capitato inoltre di doverlo utilizzare in un ciclo do-while, la cosa che mi ha sorpreso è che anche se mi vengono richiesti due inserimenti "simultaneamente" è sufficiente un solo fflush(stdin) tra il primo ed il secondo!

Grazie.

MItaly
25-10-2013, 21:03
In primis, fflush(stdin) non è standard; lo standard C dice che fflush si può usare solo su stream di output, motivo per cui su diversi compilatori (ad esempio gcc) fflush(stdin) non ha alcun effetto. Questo credo che derivi anche dal fatto che lo standard non definisce come avviene il buffering in input, motivo per cui una chiamata del genere non avrebbe un effetto ben definito.

Quanto al buffering in input, normalmente avviene a due livelli; in primis, il sistema operativo fa buffering dei tasti inseriti nella console - ovvero, quando viene premuto un tasto questo deve essere messo in un buffer per essere processato poi, quando il programma effettivamente lo richiede. In secondo luogo, anche la libreria C fa buffering in input, chiamando le funzioni del sistema operativo per la lettura di stream solo di tanto in tanto - tipicamente per lo standard input cercherà di leggere tutto il contenuto del buffer del sistema, per poi dispensarlo man mano tramite le funzioni di input del C (scanf, getchar, fgets, ...).

Se svuoti il buffer di input, l'effetto netto è di buttare via tutti i caratteri che sono già stati inseriti da tastiera, ma ancora non sono stati processati. Tipicamente questo può servire se il programma si è accorto che è stato inserito un input errato e si vuole scartare tutto quello che è stato inserito da tastiera finora per evitare che, alla successiva fgets o scanf, si continuino a leggere il resto dei dati errati già inseriti.

Satiro88
26-10-2013, 13:35
In primis, fflush(stdin) non è standard; lo standard C dice che fflush si può usare solo su stream di output, motivo per cui su diversi compilatori (ad esempio gcc) fflush(stdin) non ha alcun effetto. Questo credo che derivi anche dal fatto che lo standard non definisce come avviene il buffering in input, motivo per cui una chiamata del genere non avrebbe un effetto ben definito.

Quanto al buffering in input, normalmente avviene a due livelli; in primis, il sistema operativo fa buffering dei tasti inseriti nella console - ovvero, quando viene premuto un tasto questo deve essere messo in un buffer per essere processato poi, quando il programma effettivamente lo richiede. In secondo luogo, anche la libreria C fa buffering in input, chiamando le funzioni del sistema operativo per la lettura di stream solo di tanto in tanto - tipicamente per lo standard input cercherà di leggere tutto il contenuto del buffer del sistema, per poi dispensarlo man mano tramite le funzioni di input del C (scanf, getchar, fgets, ...).

Se svuoti il buffer di input, l'effetto netto è di buttare via tutti i caratteri che sono già stati inseriti da tastiera, ma ancora non sono stati processati. Tipicamente questo può servire se il programma si è accorto che è stato inserito un input errato e si vuole scartare tutto quello che è stato inserito da tastiera finora per evitare che, alla successiva fgets o scanf, si continuino a leggere il resto dei dati errati già inseriti.

Grazie anche se faccio comunque fatica a capire quello che dici xD

ma fisicamente cosa succede quando faccio, per esempio, printf(inserisci carattere), scanf e quindi fflush? Cioè io fflush in questo caso non lo uso per eliminare qualcosa che già c'era ma per qualcosa che sto mettendo ora no? Cioè per via di quel tasto invio se è così, perché non mi cancella anche il carattere che ho inserito e che mi era richiesto?

MItaly
26-10-2013, 15:10
Ora sono io che non ti seguo... :stordita: prova a spiegarti un po' più chiaramente.

Loading