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.
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.
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.
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
.
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.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.