¿Por qué tengo que ingresar EOF 3 veces cuando uso fgets?

2 minutos de lectura

¿Por que tengo que ingresar EOF 3 veces cuando uso
Pedro

Básicamente, quiero copiar todo lo que escribo en stdin (incluido el carácter de nueva línea) en una cadena con fines hash. Me las arreglé para lograr eso e hice un pequeño código para representar mi problema.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFFERSIZE 10000

int main()
{
char *myStr = calloc(1,1);
char buffer[BUFFERSIZE];

while( fgets(buffer, BUFFERSIZE , stdin) != NULL ){
  myStr = realloc(myStr, strlen(myStr)+1+strlen(buffer) );
  strcat( myStr, buffer );
}
printf("\n%s\n",myStr);

}

todo funciona cuando ingreso un texto, luego presiono ENTER y luego llamo a EOF.

Pero cuando inicio el programa, ingreso “a”, luego trato de llamar a EOF (usando Control Z + (Indicador de cmd de Windows), Control D (Linux)) Tengo que hacerlo tres veces para que el programa realmente rompa el bucle. Esperaba un máximo de 2 veces.

¿Alguien puede explicar cómo funciona el uso de EOF, stdin y fgets? ¿O debería usar algo más (por ejemplo, getline)? Lo siento si no tengo claro mi problema, solo pregunta lo que necesites.

Gracias.

  • Aquí hay una explicación de cómo funciona Ctrl+D.

    – usuario3386109

    20 de abril de 2015 a las 23:31

  • ¡No puede usar Ctrl+Z porque el terminal usa Ctrl+Z para suspender el proceso!

    – Sir Jo Negro

    20 de abril de 2015 a las 23:32

  • @SergioFormiggini Ctrl+Z es el carácter EOF en Windows.

    – usuario3386109

    20/04/2015 a las 23:35

  • ¡OK! me he olvidado de windows :p

    – Sir Jo Negro

    20 de abril de 2015 a las 23:46

En primer lugar, ^Z o ^D son caracteres de control que significan algo para el terminal que está utilizando, y a veces eso significa que la terminal señale la condición de fin de archivo.

De todos modos, sus tres pulsaciones de teclas son procesadas por el terminal para realizar las siguientes acciones, después de ingresar el texto:

  1. Vacíe la entrada (es decir, envíe los caracteres que se han ingresado hasta ahora desde la terminal al programa; de manera predeterminada, esto no sucede ya que la terminal usa el almacenamiento en búfer de línea)
  2. Establecer condición de fin de archivo
  3. Establecer de nuevo la condición de fin de archivo

Dentro de su programa que corresponde a:

  1. No pasa nada: aunque a Esta recibido, fgets sigue leyendo hasta el final del archivo o nueva línea
  2. fgets se completa debido al final del archivo. Sin embargo, no devuelve NULL porque se leyeron los caracteres, "a" ser especifico.
  3. fgets se completa debido al final del archivo y regresa NULL porque no había caracteres leídos.

  • Tenga en cuenta que el EOF “perdido” se puede detectar mediante el retorno corto sin nueva línea o mediante feof.

    – Davis arenque

    13 de septiembre de 2019 a las 23:28

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad