2010-01-23 12 views
14

stdout è bufferizzato in linea quando connesso a un terminale, ma mi ricordo di aver letto da qualche parte che la lettura (almeno da stdin) svuoterà automaticamente lo stdout. Tutte le implementazioni C che ho usato hanno fatto questo, ma non riesco a trovarlo nello standard ora.Lettura da stdin flush stdout?

ha senso che funziona in questo modo, altrimenti il ​​codice come questo:

printf("Type some input: "); 
fgets(line, sizeof line, stdin); 

avrebbe bisogno di un extra fflush(stdout);

Così è stdout garantito per essere lavata qui?

EDIT:

Come diverse risposte hanno detto, non sembra esserci alcuna garanzia nella norma che l'uscita a stdout nel mio esempio apparirà prima della lettura da stdin, ma d'altra parte , questo intento è indicato nel (mio progetto copia gratuita) della norma:

l'ingresso e di uscita dinamica della dispositivi interattivi avranno luogo come specificato in 7.19.3. L'intento di questi requisiti è che l' senza buffer o l'uscita bufferizzata di linea vengano visualizzati non appena possibile , per garantire che i messaggi di richiesta vengano effettivamente visualizzati prima di un programma in attesa di input.

(ISO/IEC 9899: Comitato TC2 Progetto - 6 maggio 2005, pagina 14).

Quindi sembra che non ci sia alcuna garanzia, ma probabilmente funzionerà comunque nella maggior parte delle implementazioni. (Ultime parole famose ...)

+1

Seguendo il rinvio a 7.19.3 (7.21.3 a C11) è anche utile, poiché menziona quali operazioni di input dovrebbero causare rossore. Questi sono discussi su https://stackoverflow.com/a/39536803/8586227. –

risposta

4

No, non è così.

+0

Ma generalmente quello che vediamo è che lo stdout viene svuotato prima della linea di fgets. Quindi, perché è arrossito qui. –

+0

Sembra che un'implementazione C sia _allowed_ dallo standard per non stampare il prompt prima dei fgets, ma l'intensione è che dovrebbe, e penso che la maggior parte (tutte?) Le implementazioni. –

+0

Seguire questa intenzione renderebbe tutto più lento, e con un dubbio beneficio. –

4

No. È necessario eseguire il fflush (stdout); Molte implementazioni svuoteranno ad ogni nuova riga di invio di output a un terminale.

+0

AFIAK 'stdout' è richiesto da standard da linea tamponato o buffer di default. – ybungalobill

5

Per rispondere alla tua domanda, ti fai bisogno l'extra fflush(stdout); dopo la vostra printf() chiamata per assicurarsi che la richiesta viene visualizzata prima che il programma cerca di leggere l'input. La lettura da stdin non corrisponde a fflush(stdout);.

4

No. stdin/stdout sono memorizzati nel buffer. È necessario esplicitamente fflush(stdout) in modo che i dati memorizzati nella memoria del terminale di memoria video/unix vengano trasferiti su un dispositivo di visualizzazione come un terminale. Il buffering dei dati può essere impostato chiamando setvbuf.

Modifica: Grazie Jonathan, per rispondere alla domanda, la lettura da stdin non svuota lo stdout. Potrei essermi perso la tangente specificando il codice che dimostra come usare setvbuf.

 
    #include 

    int main(void) 
    { 
    FILE *input, *output; 
    char bufr[512]; 

    input = fopen("file.in", "r+b"); 
    output = fopen("file.out", "w"); 

    /* set up input stream for minimal disk access, 
     using our own character buffer */ 
    if (setvbuf(input, bufr, _IOFBF, 512) != 0) 
     printf("failed to set up buffer for input file\n"); 
    else 
     printf("buffer set up for input file\n"); 

    /* set up output stream for line buffering using space that 
     will be obtained through an indirect call to malloc */ 
    if (setvbuf(output, NULL, _IOLBF, 132) != 0) 
     printf("failed to set up buffer for output file\n"); 
    else 
     printf("buffer set up for output file\n"); 

    /* perform file I/O here */ 

    /* close files */ 
    fclose(input); 
    fclose(output); 
    return 0; 
    } 

Spero che questo aiuti, i migliori saluti, Tom.

+0

In che modo il tuo codice si riferisce al comportamento di stdin e stdout? –

+0

@ Jonathan: È un esempio di come impostare il buffer per l'input usando setvbuf per essere 512, o qualsiasi figura per quella materia, preferibilmente su un limite di parole. Questo è stato un esempio tratto dal file di aiuto sul compilatore di Borland C che mostra l'uso di setvbuf. – t0mm13b

+0

Il codice va bene come risposta ad un'altra domanda: non risponde alla domanda posta, che è "legge da stdin flush stdout". Non ho intenzione di penalizzarti per una risposta tangenziale - ma considero la tua risposta tangenziale. –

2

No, non fa parte dello standard.È certamente possibile che tu abbia utilizzato un'implementazione di libreria in cui il comportamento che hai descritto è accaduto, ma si tratta di un'estensione non standard su cui non devi fare affidamento.

1

No. Attenzione per situazioni di stallo tra processi quando si tratta di flussi std quando uno continua a leggere stdin o scrivere su blocchi stdout.