Agenda de Contactos en C++: Gestión de Registros con Archivos Binarios y CSV

Agenda de Contactos en C++: Gestión de Registros con Archivos Binarios y CSV

Este programa escrito en C++ permite gestionar una agenda de contactos completa. Puedes dar de alta, modificar o eliminar registros, y ordenar la información por nombre, apellidos, o edad. Los datos se almacenan en un archivo binario y se pueden exportar en formato CSV para facilitar su uso con otras aplicaciones.

Una gran ventaja de este programa es su compatibilidad con Linux, aunque en Windows se debe quitar la función sleep() para un funcionamiento adecuado. En este post, exploraremos cómo se organiza este programa y cómo puedes usarlo para manejar tus propios registros.

Funcionalidades del Programa

Este programa te permite realizar las siguientes operaciones sobre una agenda:

  1. Agregar Registros: Puedes agregar nuevos contactos a la agenda, incluyendo información como nombre, apellidos, edad, teléfono, dirección, etc.

  2. Eliminar Registros: Puedes eliminar registros específicos por su clave.

  3. Modificar Registros: Actualiza cualquier dato de un registro existente.

  4. Ordenar Registros: Ordena la agenda por nombre, apellidos, edad o calle.

  5. Mostrar Todos los Registros: Muestra la lista completa de registros.

  6. Exportar a CSV: Guarda los registros en un archivo CSV para compartir o analizar en otras aplicaciones.

Estructura del Código

Vamos a explorar la estructura del código de manera resumida para entender mejor cómo funcionan las funciones principales:

1. Definiciones y Estructura Principal

El código comienza definiendo las librerías necesarias y la estructura principal agenda. Esta estructura contiene todos los campos relevantes de un contacto, como su nombre, teléfono y dirección:

#define FICHERO "datos"
#define MAX 25

FILE *fichero;

struct agenda {
    int clave;
    char nom[20];
    char ApPat[15];
    char ApMat[15];
    int edad;
    long int tel;
    long int cel;
    char calle[15];
    char col[15];
    char mun[15];
    char estado[15];
    int sw;
    char mail[25];
} r[MAX];

Esta estructura se usará para almacenar y manejar los datos de cada contacto.

2. Apertura del Archivo

La función apertura() es responsable de abrir el archivo binario que almacena los registros. Si el archivo no existe, lo crea:

void apertura(void) {
    if ((fichero = fopen(FICHERO, "r+")) == NULL)
        fichero = fopen(FICHERO, "w");
}

3. Menú Principal

El programa presenta un menú de opciones para el usuario. Esto le permite navegar por las distintas funcionalidades disponibles:

int menu(void) {
    int opmenu = 0;
    printf("\nMENU\n");
    printf("1) Agregar\n2) Borrar\n3) Buscar\n4) Mostrar Todos\n5) Ordenar Archivo\n6) Listar\n7) Modificar Registro\n8) Exportar\n9) Salir\n");
    printf("Opcion: ");
    scanf("%d", &opmenu);
    return opmenu;
}

4. Agregar un Registro

La función agregar() permite al usuario agregar un nuevo registro al archivo binario. Primero se verifica si la clave ya está en uso, luego se solicita al usuario que ingrese los datos del contacto:

void agregar(void) {
    int clave;
    struct agenda registro, aux;

    clavesdisponibles();
    do {
        printf("Dame tu clave: ");
        scanf("%d", &clave);
        if (clave > MAX) {
            printf("Tu clave debe ser menor que %d\n", MAX);
        }
        aux = ReadToDisk(clave);
        if (aux.sw == 1) {
            printf("La clave ya está en uso\n");
        }
    } while (clave > MAX || aux.sw == 1);

    // Resto del código para ingresar datos...
}

5. Mostrar Todos los Registros

La función m_todo() lee todos los registros del archivo y los muestra en pantalla. Es útil para visualizar la agenda completa de contactos:

void m_todo(void) {
    int i = 2;
    struct agenda registro;
    registro = ReadToDisk(1);
    do {
        if (registro.sw == 1)
            mostrar(registro);
        registro = ReadToDisk(i);
        i++;
    } while (!feof(fichero));
}

6. Exportar a CSV

Finalmente, la función exportar() permite al usuario guardar todos los registros en un archivo CSV. Esto facilita el compartir o analizar los datos en aplicaciones como Excel:

void exportar(void) {
    FILE *archivo;
    char nombre[20];
    int c, i;
    c = ReadAllToDisk();
    OrdenaOnMemory(c, 1);
    printf("Nombre del Archivo: ");
    scanf("%s", nombre);
    archivo = fopen(nombre, "w");

    for (i = 0; i < c; i++) {
        fprintf(archivo, "%d,%s,%s,%s,%d,%ld,%ld,%s,%s,%s,%s,%s\n", r[i].clave, r[i].nom, r[i].ApPat, r[i].ApMat, r[i].edad, r[i].tel, r[i].cel, r[i].calle, r[i].col, r[i].mun, r[i].estado, r[i].mail);
    }
    fclose(archivo);
}

Código Completo

#include <stdio.h>
#include <string.h>
#define FICHERO "datos"
#define MAX 25
#define ESCAPE ((char)27)

FILE *fichero;

struct agenda {
    int clave;
    char nom[20];
    char ApPat[15];
    char ApMat[15];
    int edad;
    long int tel;
    long int cel;
    char calle[15];
    char col[15];
    char mun[15];
    char estado[15];
    int sw;
    char mail[25];
} r[MAX];

// Declaración de prototipos de funciones
int menu(void);
void agregar(void);
void mostrar(struct agenda);
void buscarnom(char[]);
void buscaredad(int);
void apertura(void);
void m_todo(void);
void borrar(int);
void borrartodo(void);
void ordena(void);
void SaveToDisk(struct agenda);
struct agenda ReadToDisk(int);
int ReadAllToDisk(void);
void OrdenaOnMemory(int, int);
void clavesdisponibles(void);
void actualizar(struct agenda, int);
void exportar(void);

int main() {
    int op;
    apertura();

    while ((op = menu()) != 9) {
        switch (op) {
            case 1:
                agregar();
                break;
            case 2:
                int clave;
                printf("Dame la clave a borrar: ");
                scanf("%d", &clave);
                borrar(clave);
                break;
            case 3:
                // Código para buscar registros
                break;
            case 4:
                m_todo();
                break;
            case 5:
                ordena();
                break;
            case 6:
                // Código para listar registros
                break;
            case 7:
                // Código para modificar registros
                break;
            case 8:
                exportar();
                break;
            default:
                printf("Opción no válida. Intente nuevamente.\n");
        }
    }

    fclose(fichero);
    return 0;
}

Cosas a Tener en Cuenta

  • Compatibilidad con Sistemas Operativos: Este código funciona perfectamente en Linux, pero si se usa en Windows, hay que quitar la función sleep() para evitar problemas.

  • Archivos Binarios vs. Archivos de Texto: La información se guarda en un archivo binario para mantener la estructura compacta y evitar la manipulación directa, pero se proporciona una opción de exportación en CSV para un formato más amigable.

Mejoras Futuras

  • Mejorar la Interfaz de Usuario: Podría beneficiarse de una interfaz más moderna, quizá utilizando una biblioteca gráfica para ofrecer menús más intuitivos.

  • Agregar Validaciones de Datos: Incluir validaciones adicionales para asegurarse de que la información proporcionada sea correcta y evitar registros con datos inconsistentes.

  • Optimizar el Manejo de Archivos: Podría mejorarse la forma en que se leen y escriben los registros, quizá mediante el uso de punteros inteligentes y gestión de errores más robusta.

Conclusión

Este programa de gestión de agenda en C++ demuestra cómo gestionar eficientemente la información personal de los contactos utilizando archivos binarios. Aunque tiene un enfoque clásico y puede beneficiarse de mejoras modernas, es un excelente punto de partida para cualquiera que quiera aprender sobre manejo de archivos en C++.

¡Prueba el código y modifica la agenda según tus necesidades! Con algunos cambios, podría ser la base de una aplicación de gestión personal mucho más amplia.