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.
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