Leer archivo línea por línea usando fscanf en C

Jinku Hu 12 octubre 2023
  1. Utilice la función fscanf para leer el archivo línea por línea en C
  2. Utilice la función fscanf para leer el archivo palabra por palabra en C
Leer archivo línea por línea usando fscanf 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C File