2009-12-02 6 views
23

Ho un file di testo con stringhe su ogni riga. Voglio incrementare un numero per ogni riga nel file di testo, ma quando raggiunge la fine del file deve ovviamente fermarsi. Ho provato a fare qualche ricerca su EOF, ma non sono riuscito a capire come usarlo correttamente.Come utilizzare EOF per eseguire un file di testo in C?

Suppongo di aver bisogno di un ciclo while, ma non sono sicuro di come farlo.

risposta

67

Come si rileva EOF dipende da ciò che si sta utilizzando per leggere il flusso:

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 

Controllare il risultato della chiamata in ingresso per la condizione appropriata di cui sopra, quindi chiamare feof() per determinare se il risultato è stato determinato per colpire EOF o qualche altro errore.

Utilizzando 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 
} 

Utilizzando 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 
} 

Utilizzando fgetc():

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

Utilizzando 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 
} 

Si noti che il modulo è lo stesso per tutti: controllare il risultato dell'operazione di lettura; in caso negativo, quindi controllare per EOF. Vedrete un sacco di esempi come:

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

Questo modulo non funziona il modo in cui la gente pensa lo fa, perché feof() non tornerà vero fino dopo aver tentato di leggere oltre la fine del file. Di conseguenza, il ciclo viene eseguito una volta in più, il che può causare o meno qualche problema.

+0

Bello, ma alcuni suggerimenti di questa risposta popolare: 1) "Funzione:' fscanf() 'risultato su EOF o errore: numero di conversioni riuscite meno del previsto" equivale a un "errore" di input con errori di conversione del formato. Non un raggruppamento corretto IMO: Suggerisci un'altra colonna OTOH è una funzione complicata 2) controllo ortografico 3) Suggerisci commento "codice errato" nell'esempio 'while (! Feof (stream))'. – chux

10

Una possibile anello C potrebbe essere:

#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. 
     */ 
    } 
} 

Per ora, vorrei ignorare feof e simili funzioni. L'esperienza mostra che è fin troppo facile chiamarla nel momento sbagliato e elaborare qualcosa per due volte nella convinzione che l'eof non sia stato ancora raggiunto.

Fossa da evitare: utilizzando char per il tipo di c. getchar restituisce il successivo cast dei caratteri a unsigned char e quindi a int. Ciò significa che sulla maggior parte delle piattaforme [sane] il valore di EOF e valori "char" validi in c non si sovrappongono, pertanto non si rileverà mai accidentalmente per un 'normale' char.

+0

thait non funzionerà mai che non hai definito eof – streetparade

+1

I '# include' stdio.h. –

+0

vedi la mia risposta ho definito un eof – streetparade

0

È necessario controllare l'EOF dopo aver letto il file.

fscanf_s     // read from file 
while(condition)   // check EOF 
{ 
    fscanf_s    // read from file 
} 
Problemi correlati