Compartir a través de


La función Fscanf no lee líneas consecutivas según lo esperado

En este artículo se describe un problema que se produce al leer líneas de texto mediante la Fscanf función .

Versión original del producto: Visual C
Número de KB original: 60336

Resumen

Cuando un archivo está abierto en modo de texto, un intento de leer líneas de texto mediante la Fscanf función puede producir un error y solo se lee una línea de texto del archivo. El delimitador se establece en [^\n]. La Fscanf función lee hasta pero no incluye el carácter delimitador. Por lo tanto, la secuencia de archivos se detiene en la primera \n del archivo. Se produce un error en las llamadas de función posteriores Fscanf porque el puntero de archivo permanece en el carácter delimitador y la Fscanf función no puede avanzar el puntero de función más allá de él. Para mover el puntero de archivo más allá del carácter delimitador, use uno de los dos métodos siguientes:

  • Actualice el código para usar la siguiente Fscanf llamada de función:

    fscanf(stream, "%[^\n]%*c", line)
    

    El %*c especificador de formato lee un carácter de la secuencia de entrada, pero no lo asigna a ninguno de los parámetros de la fscanf llamada de función.

  • Llame a la Fgetc función después de la llamada a la Fscanf función para mover el puntero de archivo más allá del \n carácter.

En el ejemplo de código siguiente 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 final del carácter de archivo, el ejemplo de código se ejecuta en un bucle infinito si el flujo de archivo contiene un \n carácter.

Ejemplo de código

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