Gestión Avanzada de Archivos y Registros Binarios en Programación C
Clasificado en Informática
Escrito el en
español con un tamaño de 5,83 KB
Conceptos Fundamentales para el Manejo de Archivos en C
Declaración del Puntero de Archivo
El puntero de archivo es la variable que asocia el nombre físico del archivo con el programa. Todas las funciones posteriores harán referencia al archivo a través de esta variable.
Ejemplo de Declaración:
FILE *a;
FILE *f;Declaración de la Estructura (Registro)
Se define una estructura para manejar los datos de manera organizada, representando un registro dentro del archivo.
Definición de la Estructura:
struct regis
{
char nom[20];
int edad;
char domicilio[30];
};
struct regis reg; // 'reg' será la variable de tipo registro.Apertura y Modos de Acceso (fopen)
La función fopen establece la conexión entre el programa y el archivo físico, especificando el modo de operación.
Sintaxis de Apertura:
nombre_puntero_tipo_file = fopen(“ruta y nombre archivo”, “modo”);Modos de Apertura Comunes:
- “w”: Escritura. Crea un archivo nuevo. Si el archivo ya existe, su contenido es borrado y se crea de nuevo.
- “r”: Lectura. Solo permite leer el archivo.
- “a”: Adición (Append). Permite agregar registros al final de un archivo existente.
- “r+b”: Lectura y Escritura Binaria. Permite leer y grabar registros. (También se puede usar “r+” para modo texto).
Ejemplos de Apertura:
a = fopen(“datos.dat”, “w”);Se crea el archivo datos.dat y se permite la grabación. El nombre físico del archivo se asocia con el puntero a.
f = fopen(“f:\paso\perso.dat”, “r”);Solo permitirá leer del archivo ubicado en la ruta especificada.
Cierre del Archivo (fclose)
Es fundamental cerrar el archivo al terminar su uso o antes de intentar abrirlo en un modo diferente.
Sintaxis de Cierre:
fclose(nombre_variable_archivo);Ejemplo:
fclose(a);Operaciones de Lectura y Escritura de Registros
Leer un Registro (fread)
Al leer un registro, la información se almacena en una variable de tipo estructura previamente declarada (en nuestro caso, reg).
Sintaxis de Lectura:
fread(®istro, tamaño de la estructura de registro, número de registros a leer, variable del archivo)Ejemplo:
fread(®, sizeof(reg), 1, a);Grabar un Registro (fwrite)
La información que se graba en el archivo es la contenida en la variable de registro declarada (reg).
Sintaxis de Grabación:
fwrite(®istro, tamaño de la estructura de registro, número de registros a grabar, variable del archivo)Ejemplo:
fwrite(®, sizeof(reg), 1, a);La información contenida en la variable de registro reg se graba en el archivo asociado a la variable a.
Control de Flujo y Detección de Fin de Archivo
Preguntar si es Fin de Archivo (feof)
En aplicaciones donde se lee el archivo secuencialmente (registro a registro), es necesario chequear si se ha llegado al final del archivo (EOF). Todos los archivos tienen una marca de fin.
Uso de feof(archivo):
// Ejemplo 1: Se pregunta si es fin del archivo
if (feof(a))
{
// ... acciones si es EOF
};
// Ejemplo 2: Mientras no sea fin del archivo
while (!feof(a))
{
// ... operaciones de lectura y procesamiento
};Detección y Manejo de Errores (ferror y clearerr)
Detección de Error: ferror(puntero_del_archivo)
Se utiliza para detectar si ocurrió un error durante el manejo del archivo.
if (ferror(arch1))
{
// ... manejar el error
}La función devuelve el valor cero cuando no ha ocurrido error y un valor entero distinto de cero en caso de error. El indicador de error permanece activado hasta que se ejecute la función de limpieza.
Limpieza del Indicador de Error: clearerr(puntero_del_archivo)
clearerr(arch1);Mover el Indicador de Posición del Archivo (fseek)
La función fseek permite mover el indicador de posición del archivo a un byte específico. Esto es útil para acceder a un byte o registro determinado dentro del archivo.
Sintaxis:
fseek(archivo, número_desplazamiento, punto_referencia);Puntos de Referencia (SEEK):
SEEK_SET: Inicio del archivo (posición 0).SEEK_END: Fin del archivo.SEEK_CUR: Ubicación actual del indicador.
Ejemplos de Posicionamiento:
fseek(a, 2, SEEK_CUR);Avanza 2 bytes desde la ubicación actual.
fseek(a, -3, SEEK_CUR);Retrocede 3 bytes desde la ubicación actual.
fseek(a, 0, SEEK_SET);Va al inicio del archivo (primer byte).
fseek(a, -1 * sizeof(reg), SEEK_CUR);Retrocede un registro completo desde la ubicación actual (asumiendo que el indicador está al comienzo de otro registro).
Alternativa:
n = (-1) * sizeof(reg); fseek(a, n, SEEK_CUR);fseek(a, 0, SEEK_END);Va al final del archivo.