Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: kuni2006 en 2 Agosto 2016, 23:38 PM

Título: agenda archivos binarios
Publicado por: kuni2006 en 2 Agosto 2016, 23:38 PM
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("");
Título: Re: agenda archivos binarios
Publicado por: AlbertoBSD en 3 Agosto 2016, 07:44 AM
Tienes que plantear como quieres hacerlo.

Opciones:


Saludos
Título: Re: agenda archivos binarios
Publicado por: kuni2006 en 3 Agosto 2016, 17:03 PM
ya lo resolvi pero gracias de todas formas.
Título: Re: agenda archivos binarios
Publicado por: jorgediazbass en 3 Agosto 2016, 18:46 PM
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
Título: Re: agenda archivos binarios
Publicado por: AlbertoBSD en 4 Agosto 2016, 01:14 AM
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
Título: Re: agenda archivos binarios
Publicado por: kuni2006 en 5 Agosto 2016, 17:19 PM
Honestamente fue porque la consigna así lo pedia.