#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stRegistro
{
char valido; //campo que indica si el registro es valido S->Valido, N->Invalido
char nombre[34];
int dato[4];
};
int comparar(const void *, const void *);
int Menu();
void Leer(struct stRegistro *reg);
void Mostrar(struct stRegistro *reg);
void Listar(long n,struct stRegistro *reg);
long LeeNumero();
void Empaquetar(FILE **fa);
int main()
{
struct stRegistro reg;
struct stRegistro *array;
FILE *fa;
int opcion, total_registros;
long numero, conta;
fa=fopen("alea.dat","r+b"); //este modo permite leer y escribir
if(!fa)fa=fopen("alea.dat","w+b"); //si el fichero no existe, lo crea
do
{
opcion=Menu();
switch(opcion)
{
case'1': //añadir registro
Leer(®);
//insertar al final;
fseek(fa,0,SEEK_END);
fwrite(®,1,sizeof(struct stRegistro),fa);
break;
case'2': //mostrar registro
system("cls");//system("cls");
printf("Mostrar registro:");
numero=LeeNumero();
fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET);
fread(®,1,sizeof(struct stRegistro),fa);
Mostrar(®);
break;
case'3': // eliminar registro
system("cls");//system("cls");
rewind(fa);
total_registros=0;
system("cls");
printf("Nombre Calificacion\n");
while(fread(®,1, sizeof(struct stRegistro), fa)>0)
{
total_registros++;
}
array=(struct stRegistro*)malloc(total_registros*sizeof(struct stRegistro));
rewind(fa);
conta=0;
while(fread(&array[conta++],1, sizeof(struct stRegistro), fa)>0);
for(conta=0; conta<total_registros; conta++)
Listar(conta, &array[conta]);
free(array);
printf("Eliminar registro:");
numero=LeeNumero();
fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET);
fread(®,1,sizeof(struct stRegistro),fa);
reg.valido='N';
fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET);
fwrite(®,1,sizeof(struct stRegistro),fa);
break;
case'4': //mostrar todo
rewind(fa);
total_registros=0;
system("cls");
printf("Nombre Calificacion\n");
while(fread(®,1, sizeof(struct stRegistro), fa)>0)
{
total_registros++;
}
array=(struct stRegistro*)malloc(total_registros*sizeof(struct stRegistro));
rewind(fa);
conta=0;
while(fread(&array[conta++],1, sizeof(struct stRegistro), fa)>0);
qsort((void*)array, total_registros, sizeof(struct stRegistro), comparar);
for(conta=0; conta<total_registros; conta++)
Listar(conta, &array[conta]);
getch();
free(array);
break;
case'5': // eliminar marcados
Empaquetar(&fa);
break;
//NO entiendo para qué vale este case
/*
case'6':
rewind(fa);
numero=0;
system("cls");//system("cls");
printf("Nombre Datos\n");
while(fread(®,sizeof(struct stRegistro),1,fa));
Listar(numero++,®);
getch(); //system("PAUSE");
break;
*/
}
}while(opcion!='0');
fclose(fa);
return 0;
}
// Muestra un menu con las opciones disponibles y captura una opcion del usuario
int Menu()
{
char resp[20];
do
{
system("cls");//system("cls");
printf("MENU PRINCIPAL\n");
printf("--------\n\n");
printf("1-Insertar registro\n");
printf("2-Mostrar registro\n");
printf("3-Eliminar registro\n");
printf("4-Mostrar todo\n");
printf("5-Eliminar registro marcados\n");
printf("6-Mostrar lista de disponibles\n");
printf("0-Salir\n");
resp[0]=getch();
} while(resp[0]<'0'&&resp[0]>'6');
return resp[0];
}
// permite que el usuario introduzca un registro por pantalla
void Leer(struct stRegistro *reg)
{
int i;
char numero[6];
system("cls");// system("cls");
printf("Leer registro:\n\n");
reg->valido='S';
printf("Nombre:");
fgets(reg->nombre,34,stdin);
// la funcion fgets captura el retorno de linea, hay que eliminarlo:
for(i=strlen(reg->nombre)-1;i&®->nombre[i] <' ';i--)
reg->nombre[i]=0;
for(i=0;i<4;i++)
{
printf("Calificacion[%1d]:",i);
fgets(numero,6,stdin);
reg->dato[i]=atoi(numero);
}
}
// muestra un registro en pantalla, si no esta marcado como borrado
void Mostrar(struct stRegistro *reg)
{
int i;
system("cls");//system("cls");
if(reg->valido=='S')
{
printf("Nombre: %s\n",reg->nombre);
for(i=0;i<4;i++)
printf("Calificacion[%1d]:%d\n",i,reg->dato[i]);
}
i++;
getch();//system("PAUSE");
}
void Listar(long n, struct stRegistro *reg)
{
int i;
if(reg->valido=='S')
{
printf("[%6ld]%-34s",n,reg->nombre);
for(i=0;i<4;i++)
printf(",%4d",reg->dato[i]);
printf("\n");
}
}
// lee un numero suministrado por el usuario
long LeeNumero()
{
char numero[6];
fgets(numero,6,stdin);
return atoi(numero);
}
// elimina los registros marcados como borrados
void Empaquetar(FILE**fa)
{
FILE *ftemp;
struct stRegistro reg;
ftemp=fopen("alea.tmp","wb");
rewind(*fa);
while(fread(®,1,sizeof(struct stRegistro),*fa)>0)
{
if(reg.valido=='S')
fwrite(®,sizeof(struct stRegistro),1,ftemp);
}
fclose(ftemp);
fclose(*fa);
remove("alea.bak");
rename("alea.dat","alea.bak");
rename("alea.tmp","alea.dat");
*fa=fopen("alea.dat","r+b");
}
int comparar(const void *arg1, const void *arg2)
{
return strcmp(((struct stRegistro*)arg1)->nombre, ((struct stRegistro*)arg2)->nombre);
}