2010-01-23 21 views
14

stdout es un buffer de línea cuando está conectado a un terminal, pero recuerdo haber leído en alguna parte que la lectura (al menos desde stdin) se borrará automáticamente stdout. Todas las implementaciones C que he usado han hecho esto, pero ahora no puedo encontrarlo en el estándar.¿Lectura de stdin flush stdout?

Tiene sentido que funciona de esa manera, de lo contrario código como este:

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

necesitaría un extra fflush(stdout);

Así está garantizada la salida estándar a ser eliminados en esta lista?

EDIT:

Como varias respuestas han dicho, no parece haber ninguna garantía en la norma que la salida a la salida estándar en mi ejemplo aparecerá antes de la lectura de la entrada estándar, pero por otra parte , esta intención se afirma en (mi proyecto copia gratuita de) la norma:

la entrada y salida dinámica de dispositivos interactivos tendrán lugar como se especifica en 7.19.3. La intención de estos requisitos es que sin búfer o salida de búfer de línea aparezcan tan pronto como como sea posible, para asegurarse de que los mensajesaparezcan realmente antes de un programa a la espera de la entrada.

(ISO/IEC 9899: Comité TC2 Borrador - 6 de mayo de 2005, página 14).

Parece que no hay garantía, pero probablemente funcionará en la mayoría de las implementaciones de todos modos. (Famosas últimas palabras ...)

+1

Después de la referencia cruzada a 7.19.3 (7.21.3 en C11) también es útil, ya que menciona qué operaciones de entrada se espera que causen enrojecimiento. Estos se discuten en https://stackoverflow.com/a/39536803/8586227. –

Respuesta

4

No, no es así.

+0

Pero en general, lo que vemos es que stdout se vacía antes de la línea de datos. Entonces, ¿por qué se enrojece aquí? –

+0

Parece que el estándar permite una implementación en C para no imprimir el mensaje antes de los datos, pero la "intensión" es que debería, y creo que la mayoría (¿todas?) Sí lo hacen. –

+0

Seguir esta intención haría que todas las entradas fueran mucho más lentas y de dudoso beneficio. –

4

No. Necesita fflush (stdout); Muchas implementaciones se descargarán en cada nueva línea de envío de salida a un terminal.

+0

AFIAK 'stdout' es requerido por el estándar para ser buffer de línea o sin búfer por defecto. – ybungalobill

5

Para responder a su pregunta, hace necesario el extra fflush(stdout); después de su llamada printf() para asegurarse de que la confirmación antes de que el programa intenta leer la entrada. Lectura de stdin no fflush(stdout); para usted.

4

No. stdin/stdout están en el búfer. Debe explicitarse fflush(stdout) para que los datos almacenados en la memoria del video/terminal de Unix puedan enviarse a un dispositivo de visualización, como un terminal. El almacenamiento en búfer de los datos se puede configurar llamando al setvbuf.

Edit: Gracias Jonathan, para responder a la pregunta, la lectura de stdin no se borra de stdout. Puede haber salido de una tangente aquí al especificar el código que demuestra cómo usar 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; 
    } 

Espero que esto ayude, Saludos cordiales, Tom .

+0

¿Cómo se relaciona su código con el comportamiento de stdin y stdout? –

+0

@Jonathan: Es una muestra de cómo configurar el búfer para la entrada utilizando setvbuf para que sea 512, o cualquier cifra para ese asunto, preferiblemente en un límite de palabra. Esa fue una muestra tomada del archivo de ayuda del compilador de Borland C que muestra el uso de setvbuf. – t0mm13b

+0

El código está bien como respuesta a otra pregunta; no responde a la pregunta formulada, que es "does reading from stdin flush stdout". No voy a penalizarte por una respuesta tangencial, pero considero que tu respuesta es tangencial. –

2

No, eso no es parte del estándar.Es posible que haya utilizado una implementación de la biblioteca donde ocurrió el comportamiento que describió, pero esa es una extensión no estándar en la que no debe confiar.

1

No. Tenga cuidado con los interbloqueos entre procesos cuando se trata de flujos estándar cuando lee en stdin o escribe en bloques stdout.

Cuestiones relacionadas