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:

  1. 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.

  2. 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(&registro, tamaño de la estructura de registro, número de registros a leer, variable del archivo)

Ejemplo:

fread(&reg, 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(&registro, tamaño de la estructura de registro, número de registros a grabar, variable del archivo)

Ejemplo:

fwrite(&reg, 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:

  1. fseek(a, 2, SEEK_CUR);

    Avanza 2 bytes desde la ubicación actual.

  2. fseek(a, -3, SEEK_CUR);

    Retrocede 3 bytes desde la ubicación actual.

  3. fseek(a, 0, SEEK_SET);

    Va al inicio del archivo (primer byte).

  4. 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);
  5. fseek(a, 0, SEEK_END);

    Va al final del archivo.

Entradas relacionadas: