Pregunta

Estoy teniendo un tiempo duro con un bucle do-while, que se supone que parada cuando se llega al final del archivo. Aquí está el código de bucle:

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));

Después de ejecutar con el depurador, me di cuenta de que todos los problemas de choque que tengo son porque no sale de este bucle, incluso cuando alcanzó el conjunto de líneas.

¿Cómo debo escribirlo correctamente?

¿Fue útil?

Solución

que cambiaría su bucle y la lógica para utilizar este:

while (fgets(pcompanyRow, 1024, f) != NULL) {

    /* do things */

}

cuando fgets () intentos de leer más allá del final del archivo, devolverá NULL y se le salir del bucle. Todavía se puede seguir utilizando su pass y otras banderas / lógica, pero las condiciones controlará que será un poco diferente.

Otros consejos

Nunca se debe utilizar feof () como el indicador de salida de un bucle. feof () es TRUE sólo después del final del archivo (EOF) se lee, no cuando se alcanza EOF

aquí . También explica detalladamente el problema y cómo solucionarlo.

Sugiero utilizar ambos fgets () y feof (). Última cadena en el archivo podría tener \ n o quizás no. Si sólo utiliza feof (), puede omitir (perdido) última línea.

 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top