Domanda

un'altra domanda, < a href = "https://stackoverflow.com/users/179910/jerry-coffin"> Jerry Coffin ha sottolineato quanto segue:

  

E '(probabilmente) non proprio legati alla tua domanda, ma while (!feof(fileptr)){ è praticamente un bug garantito.

ho pensato vorrei iniziare una domanda separata dal momento che il commento è un po 'off-topic. Qualcuno potrebbe spiegarmi questo? Questo è stato il primo programma che ho scritto in rettilineo C prima.

È stato utile?

Soluzione

Il motivo di questa affermazione è che feof è ancora (inizialmente) falsa quando è stata raggiunta la fine del file - diventa vero solo dopo il primo tentativo fallito di leggere oltre la fine del file

.

Quindi

char mychar;
while(!feof(fileptr))
{
    fread(&mychar, sizeof(char), 1, fileptr);
    fprintf(stderr, "The char is '%c'.\n", mychar);
}

elaborerà un carattere di troppo.

Il modo corretto è quello di verificare il valore di ritorno di fread (o qualunque funzione che si sta utilizzando per leggere) o, in alternativa, chiamare feof dopo la funzione che fa la lettura. Ad esempio:

char mychar;
while(fread(&mychar, sizeof(char), 1, fileptr) > 0)
    fprintf(stderr, "The char is '%c'.\n", mychar);

Altri suggerimenti

Google trova questo: http://www.drpaulcarter.com /cs/common-c-errors.php#4.2

Si dice: "L'autore non ha ancora visto nessun studente utilizzare la funzione feof () in modo corretto!"

In sintesi, le funzioni di file C come fread e valori di stato di ritorno fwrite comunque che si non dovrebbe ignorare . Controllare il valore della feof è uno di quelli bullonatura la stalla quando i buoi sono già fuggiti genere di cose.

La lista di FAQ C ha un rispondere insieme con le risposte a molti altri come spesso domande:

  

In C, end-of-file è indicato solo dopo una procedura di ingresso ha cercato di leggere, e non è riuscito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top