//revisa el archivo para ver si encuentra datos
int estaAmigoArchivo(char *nombreArchivo,Amigo p){
FILE *file=fopen(nombreArchivo,"rb");
int existe = 0;
Amigo amigo;
while(fread(&amigo, sizeof(Amigo), 1, file)){
existe = (strcmpi(amigo.apellido,p.apellido)==0);
existe &= (strcmpi(amigo.nombre,p.nombre)==0);
existe &= (strcmpi(amigo.email,p.email)==0);
existe &= (strcmpi(amigo.celular,p.celular)==0);
existe &= (amigo.fecNac.anio==p.fecNac.anio);
existe &= (amigo.fecNac.mes==p.fecNac.mes);
existe &= (amigo.fecNac.dia==p.fecNac.dia);
}
fclose(file);
return existe;
}
int insertarInicio(Lista *lista, Amigo p){
int toReturn = 0; // 0 = error
Persona *aux = (Persona *) malloc (sizeof (Persona));
if (aux != NULL){
aux->dato=p;
aux->sig=lista->inicio;
lista->inicio=aux;
lista->cantidad++;
// Por si acaso la lista está vacía
if( !lista->fin ) lista->fin = aux;
toReturn = 1; // 1 = ok
}
return toReturn;
}
void tipoTabla(){
printf("%-15s %-15s %-15s %-12s %-10s\n\n","APELLIDO","NOMBRE","EMAIL","CELULAR","DD/MM/AAAA");
}
void mostrarAmigo(Amigo p){
printf("%-15s %-15s %-15s %-12s %i/%i/%i\n",p.apellido,p.nombre,p.email,p.celular,p.fecNac.dia,p.fecNac.mes,p.fecNac.anio);
}
void mostrarDatos(Lista *lista){
Persona *aux=lista->inicio;;
while (aux){
mostrarAmigo(aux->dato);
aux=aux->sig;
}
}
int ordenar(Lista *lista){
int pos=1;
Amigo cam;
if(lista->cantidad==1){
return 0;
}else{
Persona *aux,*aux2,*min;
min=lista->inicio;
while(pos<lista->cantidad){
aux=min;
aux2=min->sig;
while(aux2!=NULL){
if((strcmpi(aux->dato.apellido,aux2->dato.apellido))>0){ //se comparan apellidos
aux=aux2; //se compara el nombre
}else if(((strcmpi(aux->dato.apellido,aux2->dato.apellido))==0)&&((strcmpi(aux->dato.nombre,aux2->dato.nombre))>0)){
aux=aux2;
}
aux2=aux2->sig;
}
cam=min->dato;
min->dato=aux->dato;
aux->dato=cam;
min=min->sig;
pos++;
}
return 0;
}
}
void destruir (Lista *lista){
while (lista->cantidad > 0){
suprimirInicio (lista);
}
}
/* eliminación al inicio de la lista */
int suprimirInicio (Lista *lista){
if (lista->cantidad == 0){
return -1;
}
Persona *supElemento;
supElemento = lista->inicio;
lista->inicio = lista->inicio->sig;
if (lista->cantidad == 1){
lista->fin = NULL;
lista->inicio=NULL;
}
free (supElemento);
lista->cantidad--;
return 0;
}
int listaArchivo(Lista *lista, char *nombreArchivo){
if(lista->cantidad!=0){
Persona *aux=lista->inicio;
while (aux){
if(aux->dato.flag!='*'){
guardarContacto(aux->dato,nombreArchivo);
aux=aux->sig;
}
}
return 0;
}else{
return -1;
}
}
void unirListas(Lista *lista,Lista *aux){
if(aux->cantidad!=0){
Persona *recorrer=aux->inicio;
while(recorrer){
insertarInicio(lista,recorrer->dato);
recorrer=recorrer->sig;
}
ordenar(lista);
}
}
int tamanioArchivo(char *nombreArchivo){
FILE *file=fopen(nombreArchivo,"ab");
fseek(file, 0, SEEK_END);
int a=ftell(file)/sizeof(Amigo);
fclose(file);
return a;
}
int actualizarArchivo(char *nombreArchivo,Lista *lista){
if(tamanioArchivo(nombreArchivo)!=0){
Lista *aux;
if ((aux = (Lista *) calloc (1,sizeof(Lista))) == NULL){
mostrarMensajeCentro("Error de Memoria.");
return -1;
}
archivoLista(nombreArchivo,aux);
if(remove(nombreArchivo)!=-1){
unirListas(lista,aux); //une, ordena
listaArchivo(lista,nombreArchivo);
destruir(aux);
}
}else if(tamanioArchivo(nombreArchivo)==0){
if (listaArchivo(lista,nombreArchivo)==-1){
mostrarMensajeCentro("No hay elementos para guardar.");
return -1;
}
}
}
//CORREGIR ESTO
void archivoLista(char *nombreArchivo, Lista *aux){
FILE* file= fopen(nombreArchivo, "rb");
if (file==NULL){
mostrarMensajeCentro("Error al intentar acceder al archivo\n");
}else{
Amigo amigo;
rewind(file);
while(fread(&amigo, sizeof(Amigo), 1, file)){
if(amigo.flag!='*'){
insertarInicio(aux,amigo);
}
}
fclose(file);
}
}
void guardarContacto(Amigo persona, char* nombreArchivo){
FILE* file= fopen(nombreArchivo, "ab");
if (file==NULL){
mostrarMensajeCentro("Error al intentar acceder al archivo\n");
}
else{
fwrite(&persona, sizeof(Amigo), 1, file);
fclose(file);
}
}
void mostrarAgenda(char* nombreArchivo){
FILE* file= fopen(nombreArchivo, "rb");
if (file==NULL){
mostrarMensajeCentro("Error al intentar acceder al archivo\n");
}
else{
tipoTabla();
Amigo persona;
while (fread(&persona, sizeof(Amigo), 1, file)){
if(persona.flag!='*'){
mostrarAmigo(persona);
}
}
fclose(file);
printf("\n\n");
}
}
void inicializar(Indice indice[]){
int i;
for (i=0;i<Max;i++){
indice[i].letra=(17+i)+48;
indice[i].pos=-1;
indice[i].cantidad=0;
}
}
int tamanioArchivoIndice(char *nombreArchivoIndice){
FILE *file=fopen(nombreArchivoIndice,"ab");
fseek(file, 0, SEEK_END);
int a=ftell(file)/sizeof(Indice);
fclose(file);
return a;
}
int formarIndice(char *nombreArchivo,char *nombreArchivoIndice){
Indice indice[Max];
inicializar(indice);
Amigo persona;
char inic;
int t=tamanioArchivoIndice(nombreArchivo),j=0,encontrado,i=0;
FILE *file=fopen(nombreArchivo,"rb");
while(fread(&persona, sizeof(Amigo), 1, file)){
inic=persona.apellido[0];
if (inic>97 || inic<122) inic=inic-32; //Si no es mayuscula, la transforma en mayuscula
encontrado=0;
while(i<Max && encontrado!=1){
if((indice[i].letra==inic)&&(indice[i].pos==-1)){
indice[i].pos=j;
indice[i].cantidad=indice[i].cantidad+1;
encontrado=1;
}else if((indice[i].letra==inic)&&(indice[i].pos!=-1)){
indice[i].cantidad++;
encontrado=1;
}else{
i++;
}
}
j++;
}
fclose(file);
remove(nombreArchivoIndice);
arregloArchivoIndice(nombreArchivoIndice,indice);
}
void arregloArchivoIndice(char *nombreArchivoIndice,Indice indice[]){
int i;
for (i=0;i<Max;i++){
guardarIndice(nombreArchivoIndice,indice[i]);
}
}
void guardarIndice(char *nombreArchivoIndice,Indice ind){
FILE* file= fopen(nombreArchivoIndice, "ab");
if (file==NULL){
mostrarMensajeCentro("Error al intentar acceder al archivo\n");
}
else{
fwrite(&ind, sizeof(Indice), 1, file);
fclose(file);
}
}
//LLENAR EL ARCHIVO INDICE!
void tipoTablaIndice(){
printf("%-10s %-15s %-15s\n\n","LETRA","POSICION","CANTIDAD");
}
//Muestra uno
void mostrarLetra(Indice ind){
if(ind.cantidad!=0) printf("%-10c %-15d %-15d\n\n",ind.letra,ind.pos,ind.cantidad);
}
//Muestra el arreglo indice (No se usa, solo era para probar)
void mostrarArregloIndice(Indice indice[]){
int i;
tipoTablaIndice();
for (i=0;i<Max;i++){
mostrarLetra(indice[i]);
}
}
//Muestra el archivo indice (No se usa, solo era para probar)
void mostrarArchivoIndice(char* nombreArchivoIndice){
FILE* file= fopen(nombreArchivoIndice, "rb");
if (file==NULL){
mostrarMensajeCentro("Error al intentar acceder al archivo\n");
}
else{
Indice indice;
while (fread(&indice, sizeof(Indice), 1, file)){
mostrarLetra(indice);
}
fclose(file);
}
}
//Dada una pos y una cantidad, muestra contactos desde una posicion avanzando tanto como cant haya
void mostrarArchivoApellido(char *nombreArchivo,int pos,int cant){
FILE *file=fopen(nombreArchivo,"rb");
if (file==NULL){
mostrarMensajeCentro("Error al intentar acceder al archivo\n");
}
else{
int i,elem;
if (cant!=0){
elem=pos;
tipoTabla();
for (i=pos;i<pos+cant;i++){
Amigo amigo;
fseek (file, (elem)*sizeof(Amigo), SEEK_SET);
fread(&amigo, sizeof(Amigo), 1, file);
mostrarAmigo(amigo);
elem++;
}
}else{
mostrarMensajeCentro("No hay amigos con esa inicial.");
}
fclose(file);
printf("\n\n");
}
}
//Muestra los contactos dependiendo de la letra inicial
void MostrarApellidoInicial(char *nombreArchivo,char *nombreArchivoIndice,char c){
c=c-65;
FILE *file=fopen(nombreArchivo,"rb");
if (tamanioArchivo(nombreArchivo)==0){
mostrarMensajeCentro("Archivo Vacio");
fclose(file);
}else{
FILE *fileInd=fopen(nombreArchivoIndice,"rb");
if (fileInd==NULL){
mostrarMensajeCentro("Error al intentar acceder al archivo");
}else{
Indice ind;
fseek(fileInd,(c)*sizeof(Indice),SEEK_SET);
fread(&ind,sizeof(Indice),1,fileInd);
fclose(fileInd);
mostrarArchivoApellido(nombreArchivo,ind.pos,ind.cantidad);
}
}
}