El siguiente es mi código, donde uso fgetc para obtener información de stdin. (ejecutando el programa desde un shell UNIX)

Lo que no entiendo es que, cuando escribo algunos caracteres con el teclado, luego presiono ctrl + D y luego ENTER, el programa no se detiene. Me parece que EOF ya se ha transmitido al programa, ¿por qué no se detiene?

También descubrí que si presiono ENTER, luego ctrl + D, el programa se detiene, pero ¿por qué?

#include "stdio.h"

int main()
{
    char ch;
    int i;
    for (i = 0; i < 200; i++)
    {
        ch = fgetc(stdin);
        if (ch == EOF)
            break;
    }
    return 0;
}
1
Name Null 23 ago. 2020 a las 04:18

1 respuesta

La mejor respuesta

Decir que Ctrl-D envía EOF es una mentira educativa para los niños. Lo que realmente hace es hacer que cualquier read() en curso desde la terminal regrese inmediatamente con el contenido del búfer de línea actual, si lo hay.

La sinergia ocurre porque la convención de Unix es que un read() de cero bytes representa EOF.

Esto significa que si presiona Ctrl-D con un búfer vacío, read() regresará con cero bytes y un programa canónico lo interpretará como final de archivo. Obviamente, esto es solo una ilusión, ya que todavía está allí para ingresar más en el terminal, y un programa menos canónico podría seguir leyendo si quisiera.

Si, en cambio, presiona Ctrl-D después de ingresar algunos datos, entonces esos datos simplemente se devuelven y un programa canónico seguirá leyendo para encontrar un salto de línea o cualquier otra cosa que esté buscando.

Esta es la razón por la que el comportamiento EOF solo se activa en programas canónicos cuando se presiona Ctrl-D, ya sea después de otro Ctrl-D (el primero vacía el búfer, el segundo devuelve un búfer ahora vacío) o después de un Enter (por la misma razón).

2
that other guy 23 ago. 2020 a las 02:06