Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 lafscanf
llamada de función.Llame a la
Fgetc
función después de la llamada a laFscanf
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);
}