agenda archivos binarios

Iniciado por kuni2006, 2 Agosto 2016, 23:38 PM

0 Miembros y 3 Visitantes están viendo este tema.

kuni2006

Esta es la agenda que hice pero me hace falta una función que me permita actualizar los registros. Tengo algunas ideas de como hacerlo pero ninguna dio resultado, quería saber si alguno de ustedes me podía ayudar, gracias y saludos.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct
{
   unsigned long int DNI;
   unsigned long int fnac;
   char apellido[64];
   char nombres[64];
}Persona;
 
void crearArchivo(char a[],char b[]);
void menu (char* nombreArchivo, char* control);
Persona crearPersona();
void guardarPersona(Persona persona, char* nombreArchivo);
void mostrarLista(char* nombreArchivo);
void pausar();
 
int main()
{
   char nombreArchivo[20], control[20];
   int opcion1;
   printf("Ingrese el nombre del archivo(Incluya su formato): ");
   scanf("%s",&nombreArchivo);
   printf("Ingrese el nombre del archivo de control(Incluya su formato): ");
   scanf("%s",&control);
   printf("Pulse 1 si desea crear los archivos, 2 si desea proceder al menu: ");
   scanf("%d",&opcion1);
   if(opcion1==1)
   {
       fopen(nombreArchivo,"wb");
       fopen(control,"wb");
       fclose;
       menu (nombreArchivo,control);
   }
   else
   {
       menu(nombreArchivo,control);
   }
   return 0;
}
 
void menu(char* nombreArchivo, char* control)
{
   int opcion;
 
   do{
       system("cls");
       printf("1. Agregar Persona\n");
       printf("2. Consultar Lista\n");
       printf("3. Salir\n\n");
       printf("Ingresar una opcion: ");
       scanf(" %d", &opcion);
 
       if (opcion>0 && opcion<5)
           {
           system("cls");
           switch(opcion){
               case 1:
                   guardarPersona(crearPersona(), nombreArchivo);
                   break;
               case 2:
                   mostrarLista(nombreArchivo);
                   break;
               case 3:
                   printf("Fin del programa\n");
                   break;
 
           }
       }
       else
       {
           printf("\nOpcion no contemplada\n");
           pausar();
       }
   }while (opcion!=5);
}
 
Persona crearPersona()
{
   Persona persona;
 
   printf("DNI: ");
   scanf(" %d", &persona.DNI);
   printf("fnac: ");
   scanf(" %d", &persona.fnac);
   printf("Apellido: ");
   scanf(" %s", persona.apellido);
   printf("Nombres: ");
   scanf(" %s", persona.nombres);
 
   return persona;
}
 
void guardarPersona(Persona persona, char* nombreArchivo)
{
   FILE* file= fopen(nombreArchivo, "ab");
 
   if (file==NULL)
       {
       printf("Error al intentar acceder al archivo\n");
       pausar();
       }
   else
   {
       fwrite(&persona, sizeof(Persona), 1, file);
       printf("\nPersona guardada!\n");
       pausar();
       fclose(file);
   }
}
 
void mostrarLista(char* nombreArchivo)
{
   FILE* file= fopen(nombreArchivo, "rb");
 
   if (file==NULL)
       {
       printf("Error al intentar acceder al archivo\n");
       pausar();
   }
   else
   {
       Persona persona;
       printf("%-10s %-15s %-10s %s\n\n", "DNI", "FechaDeNac", "Apellido", "Nombres");
       while (fread(&persona, sizeof(Persona), 1, file))
       {
           printf("%-10d %-15d %-10s %s\n", persona.DNI, persona.fnac, persona.apellido, persona.nombres);
       }
       fclose(file);
       printf("\n\n");
       pausar();
   }
}
 
void pausar()
{
   printf("Presione ENTER para continuar");
 
   while (getchar() != '\n');
   getchar();
 
   printf("");

AlbertoBSD

Tienes que plantear como quieres hacerlo.

Opciones:


  • Reescribir todos los registros del archivo
  • Reescribir solo el registro a modificar

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

kuni2006

ya lo resolvi pero gracias de todas formas.

jorgediazbass

unsigned long int DNI;
    unsigned long int fnac;
    char apellido[64];
    char nombres[64];


para que hacer un long con el DNI ya de por si solo con int es un numero grande, al igual que en apellido y nombres, a lo sumo no pasan de 20 a 25 caracreres por lo cual 64 es mucho con demasiado y es mas memoria que ocupada tu programa en ejecucion

AlbertoBSD

Tal vez es una base de datos Mundial y un Numero Entero no alcanza para los mas de 7 Mil millones de Personas que vivimos en la tierra.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

kuni2006

Honestamente fue porque la consigna así lo pedia.