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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top