Ya vimos cómo leer un archivo de texto con Golang. Ahora se verá cómo leer el contenido de un archivo de texto con C, utilizando la función fread acompañada de fopen y otras funciones para manejar archivos en C.

Leer contenido de archivo de texto en C

Lo que se hará es simple: leer el contenido de un .txt e imprimir su contenido en la pantalla; leyendo poco a poco el archivo utilizando un búfer de determinado tamaño especificado en bytes.

Leer contenido de un archivo en C

No es recomendable leer todo el contenido a la vez, sino leer trozos pequeños del mismo. Para esto, la librería estándar en C provee el método fread; que lee algunos datos de una fuente (de tipo FILE en este caso) y va avanzando el “puntero”.

De esta manera, leemos pocos datos (los que se especifican en el búfer) en distintas iteraciones; hasta terminar de leer todo el archivo alcanzando el End Of Line o EOF.

Aquí está el código fuente para leer el contenido de un archivo de texto en C. Lo dejo aquí y lo explico más abajo.

Hola, soy un archivo de texto para demostrar algunos tutoriales de parzibyte.me. Puedo contener cualquier tipo de contenido, por ejemplo, saltos,
    tabulaciones
y cualquier

otra


cosa.
#include <stdio.h>// Todas las funciones como fread, fwrite, fopen, fclose y printf
#include <stdlib.h>// EXIT_FAILURE y EXIT_SUCCESS
#define TAMANIO_BUFER 16 // Cuántos bytes leer en cada iteración

int main() {
  unsigned char bufer[TAMANIO_BUFER];
  FILE *archivo;
  char *nombreArchivo = "archivo.txt";
  size_t bytesLeidos;

  archivo = fopen(nombreArchivo, "r"); // Abrir en modo read
  // Si es NULL, entonces no existe, o no se pudo abrir
  if (!archivo) {
    printf("¡No se pudo abrir el archivo %s!", nombreArchivo);
    return EXIT_FAILURE;
  }

  // Mientras no alcancemos el EndOfLine del archivo...
  while (!feof(archivo)) {
    // Leer dentro del búfer; fread regresa el número de bytes leídos
    bytesLeidos = fread(bufer, sizeof(char), sizeof(bufer), archivo);
    // Para depurar, se imprime la cantidad de bytes leídos (se puede quitar esa parte)
    printf("\nSe han leido %lu bytes:\n", bytesLeidos);
    // Y el contenido del búfer también es impreso
    fwrite(bufer, sizeof(char), bytesLeidos, stdout);
  }
  // Al final, se cierra el archivo
  fclose(archivo);
  return EXIT_SUCCESS;
}

En el gist se encuentra también el archivo que es leído. Ahora es momento de explicar cómo funciona el código.

Explicación del código

Comenzamos declarando un apuntador a FILE, así como el búfer y el nombre del archivo. Se llama a fopen pasándole el nombre del archivo y alojando el resultado en la variable de tipo FILE.

En caso de que el archivo no se pueda abrir, fopen devuelve NULL, así que hacemos esa comprobación y salimos del programa en caso de que no se pueda abrir el archivo.

Más tarde hacemos un ciclo while, en donde llamamos a feof. Dicha función indica si hemos alcanzado el EOF al leer un archivo; en caso de alcanzarlo, el ciclo se detiene.

Dentro del ciclo viene la parte importante, y es llamar a fread, en donde leemos desde el archivo el número de bytes que soporta el búfer. La función fread devuelve el número de bytes leídos, la mayoría de veces, si nuestro búfer es más pequeño que la cantidad de datos, se mostrará la longitud del búfer.

En la última lectura, algunas veces fread devuelve un número menor de bytes o 0, pues se ha llegado al final del archivo. Todo esto que te digo puede experimentarse al cambiar el número de bytes del búfer (recomiendo cambiarlo a 100 y luego a 1024)

Se utiliza fwrite para imprimir los datos (escribe el contenido del búfer a stdout), aunque esto no es estrictamente necesario, pues puede que deseemos leer los datos para copiarlos o para cualquier otra cosa. No usamos printf porque el búfer tiene los datos como bytes, sin el carácter de terminación.

El avance de la lectura se hace automáticamente al llamar a fread, por lo que no necesitamos hacer nada que tenga que ver con aritmética de punteros ni cosas de esas.

Al final de todo cerramos el archivo usando fclose.

Compilar ejemplo

Descarga el código fuente y guárdalo como leer_archivo.c. Asegúrate de descargar también el archivo que se va a leer, o crea uno nuevo pero ponlo en el mismo directorio que el código fuente.

Si estás en Windows y tienes el compilador de C instalado como se detalla en este post, o estás en Linux, ejecuta:

gcc -o leer_archivo leer_archivo.c

Eso creará un binario llamado leer_archivo que podrás ejecutar.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.