Leer un archivo en C

Jinku Hu 12 octubre 2023
  1. Usa las funciones fopen y fread para leer un archivo de texto en C
  2. Usar las funciones fopen y getline para leer archivos de texto en C
Leer un archivo en C

Este artículo introducirá múltiples métodos sobre cómo leer un archivo de texto en C.

Usa las funciones fopen y fread para leer un archivo de texto en C

Las funciones fopen y fread son parte de las facilidades de entrada/salida de la biblioteca estándar de C.

fopen se utiliza para abrir el archivo dado como un flujo y dar al programa el mango para manipularlo como sea necesario. Toma dos parámetros, el nombre del archivo como cadena const char* y el modo en el que se abrirá el archivo especificado con valores predefinidos (r, w, a, r+, w+, a+). Cuando necesitamos leer un fichero, pasamos r como segundo parámetro para abrir el fichero en modo de sólo lectura.

Por otro lado, la función fread es el actor principal en la realización de la operación de lectura desde un flujo de archivos ya abierto. Toma como primer argumento un puntero a la memoria intermedia donde deben almacenarse los bytes leídos. El segundo y tercer argumento especifican cuántos elementos hay que leer del flujo y qué tamaño tiene cada uno de ellos. El último argumento es el puntero FILE* al propio flujo de archivos abierto.

Observe que también estamos utilizando la función stat para recuperar el tamaño del archivo y leer todo el contenido en una sola llamada fread. El tamaño del archivo se pasa a la función malloc también para asignar suficiente espacio para almacenar todo el contenido del archivo. Sin embargo, las asignaciones de memoria dinámica deben ser liberadas por la función free y los archivos abiertos cerrados con fclose.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

int main(void) {
  const char* filename = "input.txt";

  FILE* input_file = fopen(filename, "r");
  if (!input_file) exit(EXIT_FAILURE);

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  fread(file_contents, sb.st_size, 1, input_file);

  printf("%s\n", file_contents);

  fclose(input_file);
  free(file_contents);

  exit(EXIT_SUCCESS);
}

Usar las funciones fopen y getline para leer archivos de texto en C

Alternativamente, podemos omitir la recuperación del tamaño del archivo con la función stat y en su lugar iterar sobre cada línea del archivo hasta llegar al final utilizando la función getline. La función getline lee la cadena de entrada del flujo del archivo dado. Como su nombre indica, la función recupera todos los bytes hasta encontrar el carácter de nueva línea.

La función getline toma tres parámetros, el primero de los cuales almacena los bytes leídos. Puede declararse como char* y establecerse como NULL. Mientras tanto, si el segundo argumento es la dirección del entero 0, el getline asigna automáticamente memoria dinámica para el buffer, que debe ser liberado por el usuario, de ahí la llamada a la función free al final del programa.

Tenga en cuenta que estos parámetros pueden tener diferentes valores si es necesario, todos ellos explicados en esta función manual. El tercer parámetro es el puntero FILE* del flujo de archivos abierto.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

int main(void) {
  const char* filename = "input.txt";

  FILE* input_file = fopen(filename, "r");
  if (!input_file) exit(EXIT_FAILURE);

  char* contents = NULL;
  size_t len = 0;
  while (getline(&contents, &len, input_file) != -1) {
    printf("%s", contents);
  }

  fclose(input_file);
  free(contents);

  exit(EXIT_SUCCESS);
}
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