Hola, estaba practicando con archivos binarios, y tal vez a alguien le pueda servir este source, me hace falta la actualización de datos, pero no es algo difícil.
Ahora bien, lo que no sé si es correcto, es la forma en que yo borro al archivo
ya que tengo que hacer una llamada al sistema.
/** Programa para manipular estructuras
junto con archivos tipo binarios.
El menu contiene un AB para el arc
hivo no indexado.
**/
/* Autor: cbug
Fecha: 11 de Julio de 2010
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/** DEFINICION DE TIPOS DE DATOS **/
typedef struct Fecha{
int dia;
int mes;
int año;
}stFecha;
typedef struct Persona{
char Nombre[25];
stFecha Nacimiento;
}stPersona;
/**********************************/
/** PROTOTIPOS DE FUNCIONES **/
void Ingreso(stPersona *P);
void Muestra(stPersona);
void Archivo_Escribe(stPersona *P);
long Archivo_Busca_Persona(char *nombre);
void Archivo_Elimina(void);
void Archivo_Muestra(void);
void Archivo_Borrar(void);
stPersona Persona_Blanco(void);
void Menu(void);
void ClrBuffer(void);
/*****************************/
int main(void)
{
//Variables Locales
int _opt;
stPersona _persona;
Menu();
ClrBuffer();
while(_opt != 0)
{
switch(_opt)
{
case 1:
Ingreso(&_persona);
break;
case 2:
Muestra(_persona);
break;
case 3:
Archivo_Escribe(&_persona);
break;
case 4:
Archivo_Muestra();
break;
case 5:
Archivo_Elimina();
break;
case 6:
Archivo_Borrar();
break;
default:
break;
}
Menu();
ClrBuffer();
}
return 0;
}
void ClrBuffer(void)
{
}
void Menu(void)
{
puts("************MENU************"); puts("1 - Ingreso de datos persona"); puts("2 - Muestra de datos persona"); puts("3 - Escribir en personas.dat"); puts("4 - Mostrar arc personas.dat"); puts("5 - Eliminar en personas.dat"); puts("6 - Borrar a pf personas.dat"); puts("****************************"); }
void Ingreso(stPersona *P)
{
puts("\n\tIngreso de informacion"); fgets(P
->Nombre
, sizeof(char) * 25, stdin
); puts("\t Ingreso Fecha Nacimiento"); scanf("%d", &P
->Nacimiento.
dia); ClrBuffer();
scanf("%d", &P
->Nacimiento.
mes); ClrBuffer();
scanf("%d", &P
->Nacimiento.
año
); ClrBuffer();
puts("\n\t FINALIZADO EL INGRESO"); }
void Muestra(stPersona P)
{
printf("\nNombre: %s\n", P.
Nombre); printf("\nFecha Nacimiento: %d/%d/%d\n", P.
Nacimiento.
dia, P.
Nacimiento.
mes, P.
Nacimiento.
año
); }
stPersona Persona_Blanco(void)
{
stPersona aux;
aux.Nacimiento.dia = 0;
aux.Nacimiento.mes = 0;
aux.Nacimiento.año = 0;
return aux;
}
void Archivo_Escribe(stPersona *P)
{
FILE *pf;
pf
= fopen("personas.dat", "ab"); // Abre un archivo para agregar personas if(pf == NULL)
pf
= fopen("personas.dat", "wb"); // Si no existe creamos uno nuevo fwrite(P
, sizeof(stPersona
), 1, pf
); }
void Archivo_Muestra(void)
{
FILE *pf;
stPersona *_pbuffer = NULL;
pf
= fopen("personas.dat", "rb"); if(pf == NULL)
puts("Error al intentar abrir el archivo personas.dat"); else
{
{
_pbuffer
= (stPersona
*)(malloc(sizeof(stPersona
))); fread(_pbuffer
, sizeof(stPersona
), 1, pf
); if(_pbuffer)
Muestra(*_pbuffer);
}
free(_pbuffer
);// Se debe liberar el ultimo bloque leido }
}
long Archivo_Busca_Persona(char *nombre)
{
FILE *pf;
stPersona *_pbuffer = NULL;
int counter = 0;
pf
= fopen("personas.dat", "rb"); if(pf == NULL)
puts("Error al intentar abrir el archivo personas.dat"); else
{
{
_pbuffer
= (stPersona
*)(malloc(sizeof(stPersona
))); fread(_pbuffer
, sizeof(stPersona
), 1, pf
); if(strcmp(_pbuffer
->Nombre
, nombre
) == 0) return counter;
counter++;
}
return -1;
}
}
void Archivo_Elimina(void)
{
char Nombre[25];
long Pos;
stPersona P;
FILE *pf;
printf("\nIngrese Nombre de Persona>"); fgets(Nombre
, sizeof(char) * 25, stdin
); Pos = Archivo_Busca_Persona(Nombre);
if(Pos > -1)
{
pf
= fopen("personas.dat", "wb"); fseek(pf
, Pos
* sizeof(stPersona
), 0); P = Persona_Blanco();
fwrite(&P
, sizeof(stPersona
), 1, pf
); }
else
}
void Archivo_Borrar(void)
{
}