Ejercicios de Archivos Binarios¶
Acerca de¶
Estos ejercicios tienen como propósito familiarizarse con la manipulación y persistencia de estructuras complejas de datos en almacenamiento mediante flujos binarios crudos empleando las funciones de la biblioteca estándar de C.
Capítulos de Apunte Correspondientes¶
{ref}capitulo-estructuras
{ref}capitulo-archivos-texto
Cuestiones de Estilo Aplicables¶
Chequeo de lectura/escritura: Al invocar
freadyfwrite, es mandatorio validar que la cantidad de elementos leídos o escritos coincida exactamente con el parámetro solicitado antes de asumir el éxito de la operación.Acceso seguro mediante offsets: Al realizar accesos aleatorios con
fseek, calculá los offsets multiplicando el índice de registro por el tamaño estático del struct (sizeof), previniendo desalineaciones físicas del puntero del archivo.
Escritura de Registros¶
Para los siguientes ejercicios, utilizaremos la struct producto_t:
1 2 3 4 5 6typedef struct { char sku[12]; char nombre[30]; int stock; float precio; } producto_t;
Ejercicio 28.1 - Guardar Inventario ⭐⭐☆☆☆¶
Escribir una función que reciba un arreglo de producto_t y su tamaño, y guarde
todos los productos en un archivo binario llamado inventario.dat.
Lógica y Consideraciones:
Apertura: El archivo debe abrirse en modo escritura binaria (
"wb").Escritura: Utilizar una única llamada a
fwritepara escribir el arreglo completo. La sintaxis seríafwrite(productos, sizeof(producto_t), cantidad, archivo);.Verificación: Es crucial verificar que el valor devuelto por
fwritesea igual a lacantidadde productos que se intentaron escribir.
Lectura de Registros¶
Ejercicio 28.2 - Cargar Inventario ⭐⭐☆☆☆¶
Escribir una función que lea todos los registros de inventario.dat y los
muestre por pantalla.
Lógica y Consideraciones:
Apertura: Abrir el archivo en modo lectura binaria (
"rb").Lectura: Usar un lazo
whileque intente leer un registro a la vez confread. El lazo continuará mientrasfreaddevuelva 1 (indicando que un registro fue leído exitosamente).Búfer: Se necesita una única variable de tipo
producto_tque actúe como búfer para recibir los datos de cada registro leído.Manejo de EOF: Al final del lazo, verificar
feofyferrorpara asegurarse de que la lectura terminó porque se llegó al final del archivo y no por un error.
Acceso Aleatorio¶
Ejercicio 28.3 - Leer Registro Específico ⭐⭐☆☆☆¶
Implementar una función producto_t leer_registro(int n) que lea y devuelva el
n-ésimo registro del archivo inventario.dat sin leer los registros
anteriores.
Lógica y Consideraciones:
Posicionamiento: Utilizar
fseekpara mover el puntero del archivo directamente a la posición deseada. La posición se calcula comon * sizeof(producto_t).Origen: El desplazamiento debe hacerse desde el inicio del archivo (
SEEK_SET).Lectura: Una vez posicionado, usar
freadpara leer un solo registro.
Ejercicio 28.4 - Actualizar Registro ⭐⭐☆☆☆¶
Implementar una función void actualizar_stock(int n, int nuevo_stock) que
modifique únicamente el stock del n-ésimo registro en el archivo.
Lógica y Consideraciones:
Apertura: El archivo debe abrirse en un modo que permita tanto lectura como escritura, sin borrar el contenido:
"rb+".Proceso:
Usar
fseekpara posicionarse al inicio del registron.Usar
freadpara leer el registro actual en una variableproducto_t.Modificar el campo
stocken la variable.Crucial: Usar
fseekde nuevo para volver a la misma posición (porque la lectura movió el puntero).Usar
fwritepara sobrescribir el registro en el archivo con la estructura ya modificada.