Ver Mensaje Individual
  #8 (permalink)  
Antiguo 28/07/2016, 13:25
matiri90
 
Fecha de Ingreso: abril-2016
Ubicación: Cordoba
Mensajes: 22
Antigüedad: 8 años, 7 meses
Puntos: 1
Respuesta: Archivos y Listas enlazadas simples en C

CONTINUA..

Código:
//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);
		}
	}
}