#include <stdio.h> #define MAXLINE 4096 int main(int argc, char **argv) { char *s; char buf[MAXLINE]; s = fgets(buf, MAXLINE, stdin); // here, if replaced with read(0, buf, MAXLINE); return 0; } La entrada es : 12 ctrl+d
fgets no regresa hasta que ingrese ctrl+d nuevamente (es decir: 12 ctrl+dctrl+d ). ¿Por qué fgets no regresa cuando encuentra el primer EOF ? Parece que 12 ctrl+d no funciona.
Pero cuando s = fgets(buf, MAXLINE, stdin); se reemplaza con read(0, buf, MAXLINE); read regresará (la entrada también es: 12 ctrl+d ).
Presionando CTRL + d en la terminal:
- simplemente significa vaciar todos los caracteres en
stdin(el búfer de entrada) inmediatamente- NO activa una condición EOF en
stdin
(a menos que la línea/búfer actual esté casualmente vacío).
Así que presionando CTRL+D mientras ejecuta un programa ,
fgetc() bloqueado regresará si lo hace dos veces consecutivas.EOF es válida para fgetc() y devuelve .fgetc() bloqueado regresará si lo hace una vez en una línea vacía.stdin ya vacío, es decir, la condición EOF es válida para fgetc() y regresa.read() regresa inmediatamente tan pronto como se vacía la entrada.Consulte las respuestas a esta pregunta para obtener más detalles.
En implementaciones comunes, fgets se basa en un bucle alrededor de read . Si llama a fgets , llama a read internamente. Escribir 1 2 Ctrl+D hace que read devuelva los dos caracteres "12" a fgets . Eso todavía no hace una línea completa, por lo que las llamadas fgets se read nuevamente. Dado que estamos leyendo desde un dispositivo terminal y no un archivo, por ejemplo, la read espera a que escriba más datos. Si vuelve a escribir Ctrl+D , read devuelve 0 caracteres, lo que fgets interpreta como un final de archivo y devuelve.