75 - Archivos binarios: modificar datos


Hemos visto hasta ahora como se crea un archivo binario desde C, como se lo lee, como se agregan datos al final. Nos esta quedando como modificar datos almacenados en el archivo.

Listado completo de modos de apertura de archivos binarios:

Para poder modificar datos de un archivo binario procederemos a su apertura con el modo "r+b"

Problema 1:

Confeccionar un programa con tres funciones:
1 - Creación de un archivo binario llamado "archivo4.dat" y almacenar 3 enteros. Seguidamente cerrar el archivo
2 - Abrir nuevamente el archivo pero en modo "r+b" y modificar el segundo entero almacenado en el archivo.
3 - Finalmente abrir el archivo para lectura y mostrar todos sus datos.

Archivo: programa224.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 modificar()
{
    FILE *arch;
    arch=fopen("archivo3.dat","r+b");
    if (arch==NULL)
        exit(1);
    fseek(arch, 4, SEEK_SET);
    int x=100;
    fwrite(&x, sizeof(int), 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);
    fclose(arch);
}

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

Primero creamos un archivo y almacenamos tres enteros con los valores 10, 20 y 30:

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);
}

Lo nuevo aparece en la función modificar donde procedemos a abrir el archivo en modo "r+b", es decir podemos leer y modificar datos del archivo:

void modificar()
{
    FILE *arch;
    arch=fopen("archivo3.dat","r+b");
    if (arch==NULL)
        exit(1);

Como tenemos que modificar el segundo entero que almacena el archivo procedemos a desplazar el puntero al byte 4:

    fseek(arch, 4, SEEK_SET);

Grabamos donde esta en este momento el puntero la variable x (se sobreescriben 4 bytes):

    int x=100;
    fwrite(&x, sizeof(int), 1, arch);

La función fwrite pisa datos contenidos en el archivo, con esto logramos modificar el archivo.

El algoritmo de impresión no varía respecto a 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); // 10
    printf("entero: %i\n",v1);
    fread(&v2, sizeof(int), 1, arch); // 100
    printf("entero: %i\n",v2);
    fread(&v3, sizeof(int), 1, arch); // 30
    printf("entero: %i\n",v3);
    fclose(arch);
}

Retornar