Perché questo codice bacato C?
-
22-09-2019 - |
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.
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 . 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.