¿Cómo usar EOF para ejecutar un archivo de texto en C?

 C Programming >> Programación C >  >> Tags >> File
¿Cómo usar EOF para ejecutar un archivo de texto en C?

La forma en que detecta EOF depende de lo que esté usando para leer la transmisión:

function                  result on EOF or error                    
--------                  ----------------------
fgets()                   NULL
fscanf()                  number of succesful conversions
                            less than expected
fgetc()                   EOF
fread()                   number of elements read
                            less than expected

Verifique el resultado de la llamada de entrada para la condición adecuada anterior, luego llame a feof() para determinar si el resultado se debió a presionar EOF o algún otro error.

Usando fgets() :

 char buffer[BUFFER_SIZE];
 while (fgets(buffer, sizeof buffer, stream) != NULL)
 {
   // process buffer
 }
 if (feof(stream))
 {
   // hit end of file
 }
 else
 {
   // some other error interrupted the read
 }

Usando fscanf() :

char buffer[BUFFER_SIZE];
while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion
{
  // process buffer
}
if (feof(stream)) 
{
  // hit end of file
}
else
{
  // some other error interrupted the read
}

Usando fgetc() :

int c;
while ((c = fgetc(stream)) != EOF)
{
  // process c
}
if (feof(stream))
{
  // hit end of file
}
else
{
  // some other error interrupted the read
}

Usando fread() :

char buffer[BUFFER_SIZE];
while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1 
                                                     // element of size
                                                     // BUFFER_SIZE
{
   // process buffer
}
if (feof(stream))
{
  // hit end of file
}
else
{
  // some other error interrupted read
}

Tenga en cuenta que el formulario es el mismo para todos ellos:verifique el resultado de la operación de lectura; si falló, entonces comprobar EOF. Verás muchos ejemplos como:

while(!feof(stream))
{
  fscanf(stream, "%s", buffer);
  ...
}

Este formulario no funciona de la forma en que la gente piensa, porque feof() no devolverá verdadero hasta después ha intentado leer más allá del final del archivo. Como resultado, el bucle se ejecuta demasiadas veces, lo que puede causarle algún problema o no.


Un posible bucle C sería:

#include <stdio.h>
int main()
{
    int c;
    while ((c = getchar()) != EOF)
    {
        /*
        ** Do something with c, such as check against '\n'
        ** and increment a line counter.
        */
    }
}

Por ahora, ignoraría feof y funciones similares. La experiencia demuestra que es demasiado fácil llamarlo en el momento equivocado y procesar algo dos veces con la creencia de que todavía no se ha llegado a eof.

Trampa a evitar:usar char para el tipo de c. getchar devuelve el siguiente carácter emitido a un unsigned char y luego a un int . Esto significa que en la mayoría de las plataformas [sane] el valor de EOF y válido "char " valores en c no se superponga para que nunca detecte accidentalmente EOF para un char 'normal' .