La función fscanf no lee las líneas consecutivas como se esperaba


Resumen


Cuando un archivo se abre en modo de texto, un intento de leer las líneas de texto mediante la función fscanf puede fallar y solo se lee una línea de texto del archivo. El delimeter se establece en "[^ \n]". La función fscanf Lee, pero no incluye, el carácter delimitador. Por lo tanto, la secuencia de archivo se detiene en el primer ' \n ' del archivo. Error en las llamadas de función fscanf subsiguientes porque el puntero del archivo se mantiene en el carácter delimitador y la función fscanf no puede avanzar el puntero de la función. Para mover el puntero del archivo más allá del carácter delimitador, use uno de los dos métodos siguientes:
  • Actualice el código para usar la siguiente llamada de función fscanf :
          fscanf(stream, "%[^\n]%*c", line)
    El especificador de formato "% * c" Lee un carácter de la secuencia de entrada, pero no lo asigna a ninguno de los parámetros de la llamada de función fscanf.
  • Llama a la función fgetc después de la llamada a la función fscanf para mover el puntero del archivo más allá del carácter ' \n '.
En el siguiente ejemplo de código se muestra este problema. El ejemplo de código debe leer e imprimir líneas de un archivo de texto hasta que llegue a EOF. Sin embargo, el ejemplo de código solo lee la primera línea del archivo. Dado que no se ha encontrado el fin de carácter de archivo, el ejemplo de código se ejecuta en un bucle infinito si la secuencia de archivo contiene un carácter "\n".

Código de ejemplo

FILE *stream;char line[80];while ((fscanf(stream, "%[^\n]", line)) != EOF ){   printf("Line = %s \n",line);}
En el ejemplo de código siguiente se muestra el segundo método anterior para solucionar este problema:
FILE *stream;char line[80];while ((fscanf(stream, "%[^\n]", line)) != EOF){   fgetc(stream);    // Reads in '\n' character and moves file                     // stream past delimiting character   printf("Line = %s \n", line);}