2009-12-02 14 views
23

Tengo un archivo de texto que tiene cadenas en cada línea. Quiero incrementar un número para cada línea en el archivo de texto, pero cuando llega al final del archivo, obviamente necesita detenerse. Intenté investigar sobre EOF, pero no pude entender cómo usarlo correctamente.¿Cómo usar EOF para ejecutar un archivo de texto en C?

Supongo que necesito un ciclo while, pero no estoy seguro de cómo hacerlo.

Respuesta

67

¿Cómo se detecta EOF depende de lo que estés utilizando para leer la corriente:

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 

comprobar el resultado de la llamada de entrada para la condición apropiada anteriores, llame a feof() para determinar si el resultado se debió para golpear 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: compruebe el resultado de la operación de lectura; si falló, luego compruebe si hay EOF. Usted verá un montón de ejemplos como:

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

Esta forma no funciona de la forma en que la gente piensa que lo hace, porque feof() no volverá hasta cierto después de haber intentado leer más allá del final del archivo. Como resultado, el ciclo se ejecuta una vez más, lo que puede o no causarle un poco de dolor.

+0

Bueno, pero algunas sugerencias de esta respuesta popular: 1) "Función:' fscanf() 'resultado en EOF o error: número de conversiones exitosas menos de lo esperado" equivale a un error de entrada "con fallas en la conversión de formato. OMI. Sugerir otra columna OTOH es una función complicada 2) revisión ortográfica 3) Sugerir un comentario "Código incorrecto" en el ejemplo 'while (! Feof (stream))'. – chux

10

Una 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, sería ignorar feof y similares funciones. Exprience muestra que es demasiado fácil llamarlo en el momento equivocado y procesar algo dos veces en la creencia de que eof aún no se ha alcanzado.

Peligro a evitar: usando char para el tipo de c. getchar devuelve el siguiente molde de caracteres a unsigned char y luego a int. Esto significa que en la mayoría de las plataformas [cuerdas] el valor EOF y los valores válidos "char" en c no se superponen, por lo que nunca detectará accidentalmente EOF para un "normal" char.

+0

thait nunca funcionará usted no ha definido eof – streetparade

+1

I '# include' stdio.h. –

+0

ver mi respuesta. Definí una eof – streetparade

0

Debe verificar el EOF después de leer el archivo.

fscanf_s     // read from file 
while(condition)   // check EOF 
{ 
    fscanf_s    // read from file 
} 
Cuestiones relacionadas