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
Fscanfllamada de función:fscanf(stream, "%[^\n]%*c", line)El
%*cespecificador de formato lee un carácter de la secuencia de entrada, pero no lo asigna a ninguno de los parámetros de lafscanfllamada de función.Llame a la
Fgetcfunción después de la llamada a laFscanffunción para mover el puntero de archivo más allá del\ncará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);
}