Come utilizzare feof (FILE * f)?
-
29-09-2019 - |
Domanda
Sto avendo un momento difficile con un do-while, che si suppone di arresto quando si arriva alla fine del file. Ecco il codice ciclo:
do {
if (pcompanyRow[0] != '#' && pass == 1) {
strtok(pcompanyRow, ":");
pcompanyName = strcpy(pcompanyName, strtok(NULL, ""));
pass = 2;
fgets(pcompanyRow, 1024, f);
}
if (pcompanyRow[0] != '#' && pass == 2) {
strtok(pcompanyRow, ":");
pcompanySMSPrice = strcpy(pcompanySMSPrice, strtok(NULL , ""));
pass = 3;
fgets(pcompanyRow, 1024 , f);
}
if (pcompanyRow[0] != '#' && pass == 3) {
strtok(pcompanyRow, ":");
pcompanyMMSPrice = strcpy(pcompanyMMSPrice, strtok(NULL, ""));
pass = 4;
fgets(pcompanyRow, 1024, f);
}
if (pass == 4) {
AppendCompanyNode(pcompanyList, pcompanyName, pcompanySMSPrice, pcompanyMMSPrice);
pass = 1;
}
} while (!feof(f));
Dopo aver eseguito con il debugger, ho notato che tutti i problemi di crash che ho sono perché non andare fuori da questo ciclo, anche quando ha raggiunto l'intera linea.
Come dovrei scriverlo correttamente?
Soluzione
Vorrei cambiare il loop e la logica di utilizzare questo:
while (fgets(pcompanyRow, 1024, f) != NULL) {
/* do things */
}
quando fgets () tenta di leggere oltre la fine del file, verrà restituito NULL e ti rompere fuori dal giro. È comunque possibile continuare a utilizzare pass
e il tuo altre bandiere / logica, ma le condizioni di consultare le sarà leggermente diverso.
Altri suggerimenti
Non si dovrebbe mai usare feof () come l'indicatore di uscita per un ciclo. feof () è TRUE solo dopo la fine del file (EOF) viene letto, non quando viene raggiunto EOF
qui . Ciò spiega anche il problema in dettaglio e come risolvere il problema.
Suggerisco usare entrambe fgets () e feof (). Ultimo stringa nel file potrebbe avere \ n o non potrebbe. Se si utilizza solo feof (), è possibile saltare (perduto) ultima riga.
for(;;)
{char *pc;
pc=fgets(buf,sizeof(buf),fd);
if(!pc)
{//it may be read error or end of file
if(feof(fd))
{//it is end of file, normal exit from for
break;
}
else
{//it is i/o error
fclose(fd);
return 2;
}
}
}//for