sábado, 23 de abril de 2022

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:

  • "rb" Sólo lectura. El archivo debe existir previamente. Si no existe, fopen retorna NULL.
  • "wb" Sólo escritura. Si el archivo no existía, lo crea. Si existía, destruye su contenido y lo abre vacío.
  • "ab" Sólo escritura, pero en modo append (o sea: añadir): Los datos que se graban, lo hacen al final. Crea el archivo si no existió, y no destruye su contenido si ya existió.
  • "r+b" Permite lectura y escritura. El archivo debe existir previamente.
  • "w+b" Permite escritura y lectura. Crea el archivo si no existió, pero destruye su contenido si ya existió, y lo abre vacío.
  • "a+b" Permite añadir al final, en modo lectura – escritura. Crea el archivo si no existiera. No destruye su contenido si ya existe.

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 - Crear 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 vídeo

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

vacío crear ()
{
    ARCHIVO *arco;
    arch=fopen("archivo3.dat","wb");
    si (arq==NULL)
        salir(1);
    intvalor1=10;
    fwrite(&valor1, tamaño(int), 1, arco);
    intvalor2=20;
    fwrite(&valor2, tamaño(int), 1, arco);
    intvalor3=30;
    fwrite(&valor3, tamaño(int), 1, arco);
    fclose(arco);
}

anular modificar()
{
    ARCHIVO *arco;
    arch=fopen("archivo3.dat","r+b");
    si (arq==NULL)
        salir(1);
    fseek(arco, 4, SEEK_SET);
    enterox=100;
    fwrite(&x, tamaño de(int), 1, arco);
    fclose(arco);
}

anular imprimir()
{
    ARCHIVO *arco;
    arch=fopen("archivo3.dat","rb");
    si (arq==NULL)
        salir(1);
    int v1, v2, v3;
    fread(&v1, tamaño(int), 1, arco);
    printf("entero: %i\n",v1);
    fread(&v2, tamaño(int), 1, arco);
    printf("entero: %i\n",v2);
    fread(&v3, tamaño(int), 1, arco);
    printf("entero: %i\n",v3);
    fclose(arco);
}

int principal()
{
    crear();
    modificar();
    imprimir();
    obtener();
    devolver 0;
}

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

vacío crear ()
{
    ARCHIVO *arco;
    arch=fopen("archivo3.dat","wb");
    si (arq==NULL)
        salir(1);
    intvalor1=10;
    fwrite(&valor1, tamaño(int), 1, arco);
    intvalor2=20;
    fwrite(&valor2, tamaño(int), 1, arco);
    intvalor3=30;
    fwrite(&valor3, tamaño(int), 1, arco);
    fclose(arco);
}

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:

anular modificar()
{
    ARCHIVO *arco;
    arch=fopen("archivo3.dat","r+b");
    si (arq==NULL)
        salir(1);

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

    fseek(arco, 4, SEEK_SET);

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

    enterox=100;
    fwrite(&x, tamaño de(int), 1, arco);

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

El algoritmo de impresión no varía con respecto a conceptos anteriores:

anular imprimir()
{
    ARCHIVO *arco;
    arch=fopen("archivo3.dat","rb");
    si (arq==NULL)
        salir(1);
    int v1, v2, v3;
    fread(&v1, tamaño(int), 1, arco); // 10
    printf("entero: %i\n",v1);
    fread(&v2, tamaño(int), 1, arco); // 100
    printf("entero: %i\n",v2);
    fread(&v3, tamaño(int), 1, arco); // 30
    printf("entero: %i\n",v3);
    fclose(arco);
}

No hay comentarios:

Publicar un comentario