Estoy teniendo dificultades con un bucle do-while, que se supone que se detiene cuando llegamos al final del archivo. Aquí está el código del 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 el depurador, me di cuenta de que todos los problemas de fallas que tengo se deben a que no sale de este ciclo, incluso cuando llega a todas las líneas.
¿Cómo debo escribirlo correctamente?
Como dicen las respuestas, la respuesta sucinta es “No usas feof ()”. La única vez que usa ‘feof ()’ es cuando obtiene una indicación de error o eof de una función de entrada principal (
fgets()
por ejemplo) y decide que quiere distinguir entre EOF y un error. La mayoría de las veces, la mayoría de las personas no se molestan en distinguir entre los dos (yo específicamente, pero la mayoría del código que he visto). no recuerdo haber usadofeof()
en absoluto, lo que significa que probablemente lo he usado un par de veces en el último cuarto de siglo de programación en C.–Jonathan Leffler
28 de noviembre de 2010 a las 22:17
@Jonathan: Creo que tiene mucho más sentido verificar
ferror(f)
en vez de!feof(f)
si desea saber si se produjo un error. A vecesfeof
es útil en bucles do-while, pero estoy de acuerdo en que es bastante inútil la mayor parte del tiempo.– R.. GitHub DEJA DE AYUDAR A ICE
28 de noviembre de 2010 a las 22:35
@R..: sí, tiene más sentido usar
ferror()
quefeof()
, pero confieso que tampoco lo uso a menudo. Pero debería haberlo dicho en mi comentario, o haber agregado un segundo ya que me estaba quedando sin espacio.–Jonathan Leffler
28 de noviembre de 2010 a las 22:37