Leer archivo línea por línea usando fscanf en C
-
Utilice la función
fscanf
para leer el archivo línea por línea en C -
Utilice la función
fscanf
para leer el archivo palabra por palabra en C
Este artículo explicará varios métodos de cómo leer un archivo línea por línea usando fscanf
en C.
Utilice la función fscanf
para leer el archivo línea por línea en C
La función fscanf
es parte de las utilidades de entrada formateadas de la biblioteca estándar de C. Se proporcionan múltiples funciones para diferentes fuentes de entrada como scanf
para leer desde stdin
, sscanf
para leer desde la cadena de caracteres y fscanf
para leer desde el flujo del puntero FILE
. Este último se puede utilizar para leer el archivo regular línea por línea y almacenarlos en el búfer.
fscanf
toma una especificación de formato similar a los especificadores de printf
, y todos ellos se enumeran con todo detalle en esta página. En el siguiente ejemplo, abrimos el archivo de entrada de muestra usando la llamada a la función fopen
y asignamos memoria del tamaño de archivo completo para almacenar el flujo de lectura en él. La cadena de formato "%[^\n] "
se especifica para leer el flujo de archivos hasta que se encuentra el carácter de nueva línea. fscanf
devuelve EOF
cuando se alcanza el final de la entrada; por lo tanto, iteramos con el bucle while
e imprimimos cada línea una por una.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
struct stat sb;
stat(filename, &sb);
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Producción :
> Temporary string to be written to file
Tenga en cuenta que, aunque el código anterior probablemente se ejecutará con éxito si el nombre del archivo de entrada existe en el sistema de archivos, múltiples llamadas a funciones pueden fallar y terminar el programa de manera anormal. El siguiente código de ejemplo es la versión modificada, donde se implementan las rutinas de verificación de errores.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
if (!in_file) {
perror("fopen");
exit(EXIT_FAILURE);
}
struct stat sb;
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Producción :
> Temporary string to be written to file
Utilice la función fscanf
para leer el archivo palabra por palabra en C
Otro caso útil para utilizar la función fscanf
es recorrer el archivo y analizar cada token separado por espacios. Tenga en cuenta que lo único que se puede cambiar con respecto al ejemplo anterior es el especificador de formato a "%[^\n ] "
. La llamada al sistema stat
es para recuperar el tamaño del archivo, y el valor se usa para pasar como el argumento malloc
para asignar el búfer. Este método puede ser un desperdicio para algunos escenarios, pero asegura que incluso los archivos de una sola línea más grandes se puedan almacenar en el búfer.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
if (!in_file) {
perror("fopen");
exit(EXIT_FAILURE);
}
struct stat sb;
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Producción :
> Temporary
> string
> to
> be
> written
> to
> file
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook