74 - Archivos binarios: agregar datos


Hemos visto que cuando necesitamos crear un archivo lo hacemos pasando a la función fopen el valor "wb". Con esto indicamos que se cree el archivo y si ya existe lo borre y lo cree nuevamente vacío.

En muchas situaciones podemos necesitar agregar datos al archivo sin tenerlo que borrar, para esto debemos pasar a la función fopen el valor "ab" (append binary)

Problema 1:

Confeccionar un programa con tres funciones:
1 - Creación de un archivo binario llamado "archivo3.dat" y almacenar 3 enteros. Seguidamente cerrar el archivo
2 - Abrir nuevamente el archivo pero en modo de añadir y almacenar 1 float.
3 - Finalmente abrir el archivo para lectura y mostrar todos sus datos.

Archivo: programa223.c

Ver video

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

void crear()
{
    FILE *arch;
    arch=fopen("archivo3.dat","wb");
    if (arch==NULL)
        exit(1);
    int valor1=10;
    fwrite(&valor1, sizeof(int), 1, arch);
    int valor2=20;
    fwrite(&valor2, sizeof(int), 1, arch);
    int valor3=30;
    fwrite(&valor3, sizeof(int), 1, arch);
    fclose(arch);
}

void agregar()
{
    FILE *arch;
    arch=fopen("archivo3.dat","ab");
    if (arch==NULL)
        exit(1);
    float f1=5.45;
    fwrite(&f1, sizeof(float), 1, arch);
    fclose(arch);
}

void imprimir()
{
    FILE *arch;
    arch=fopen("archivo3.dat","rb");
    if (arch==NULL)
        exit(1);
    int v1, v2, v3;
    fread(&v1, sizeof(int), 1, arch);
    printf("entero: %i\n",v1);
    fread(&v2, sizeof(int), 1, arch);
    printf("entero: %i\n",v2);
    fread(&v3, sizeof(int), 1, arch);
    printf("entero: %i\n",v3);
    float f1;
    fread(&f1, sizeof(float), 1, arch);
    printf("float: %0.2f\n",f1);
    fclose(arch);
}

int main()
{
    crear();
    agregar();
    imprimir();
    getch();
    return 0;
}

La primer función que se llama desde la main es crear:

void crear()
{
    FILE *arch;
    arch=fopen("archivo3.dat","wb");
    if (arch==NULL)
        exit(1);
    int valor1=10;
    fwrite(&valor1, sizeof(int), 1, arch);
    int valor2=20;
    fwrite(&valor2, sizeof(int), 1, arch);
    int valor3=30;
    fwrite(&valor3, sizeof(int), 1, arch);
    fclose(arch);
}

En esta función se crea un archivo binario llamado "archivo3.dat" si ya existe se vuelve a crear porque pasamos "wb" (write binary)

Se graban tres valores enteros.

La segunda función llamada "agregar" es donde aparece lo nuevo donde procedemos a la apertura del archivo para añadir datos "ab" (append binary):

void agregar()
{
    FILE *arch;
    arch=fopen("archivo3.dat","ab");
    if (arch==NULL)
        exit(1);
    float f1=5.45;
    fwrite(&f1, sizeof(float), 1, arch);
    fclose(arch);
}

Cuando se abre para añadir el puntero de archivo apunta al final donde procedemos a grabar en este caso un valor float. Es decir ahora nuestro archivo almacena 4 datos: 3 enteros y un float.

El algoritmo de impresión es similar a lo visto en conceptos anteriores:

void imprimir()
{
    FILE *arch;
    arch=fopen("archivo3.dat","rb");
    if (arch==NULL)
        exit(1);
    int v1, v2, v3;
    fread(&v1, sizeof(int), 1, arch);
    printf("entero: %i\n",v1);
    fread(&v2, sizeof(int), 1, arch);
    printf("entero: %i\n",v2);
    fread(&v3, sizeof(int), 1, arch);
    printf("entero: %i\n",v3);
    float f1;
    fread(&f1, sizeof(float), 1, arch);
    printf("float: %0.2f\n",f1);
    fclose(arch);
}

Retornar