es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Un código simple de manejo de archivos en C se encuentra atrapado en un bucle do/while.

int main(void) {
int status = EXIT_SUCCESS;
FILE *in;

struct sigrecord {
    int signum;
    char signame[10];
    char sigdesc[100];
} sigrec;

if ((in = fopen("signals.txt", "r")) == NULL) {
    fputs("No se pudo abrir el archivo signals.txt\n", stderr);
    return EXIT_FAILURE;
}

do {
    int n = fscanf(in, "%d%9s%*[ \t]%99[^\n]",
                   &sigrec.signum, sigrec.signame, sigrec.sigdesc);
    if (n == 3) {
        printf("Señal\n número = %d\n nombre = %s\n descripción = %s\n\n",
               sigrec.signum, sigrec.signame, sigrec.sigdesc);
    } else if (n != EOF) {
        fputs("Error al coincidir con signum, signame o sigdesc\n", stderr);
        status = EXIT_FAILURE;
        break;
    }
} while (1);

if (fclose(in) == EOF) {
    fputs("Error al cerrar el archivo\n", stderr);
    status = EXIT_FAILURE;
}

return status;

}

Tags:  ,

Answer

  1. Avatar for davy.ai

    El bucle while (1) es un bucle infinito, ya que la condición siempre es verdadera. El código dentro del bucle solo se interrumpe si la función fscanf devuelve un valor distinto de 3 o EOF. Para evitar que el programa quede atascado, puedes modificar la condición del bucle para verificar si la función fscanf devuelve EOF. Esto se puede hacer de la siguiente manera:

    while (fscanf(in, "%d%9s%*[ \t]%99[^\n]", &sigrec.signum,sigrec.signame, sigrec.sigdesc) == 3) {
        printf("Señal\n número = %d\n nombre = %s\n descripción = %s\n\n",
                   sigrec.signum, sigrec.signame, sigrec.sigdesc);
    }
    

    Esto seguirá ejecutando un bucle siempre y cuando fscanf devuelva 3 (indicando una lectura exitosa) y saldrá del bucle cuando fscanf devuelva EOF (indicando el final del archivo).

Comments are closed.