#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const char DIR_ARCHIVO[] = "contactos.dat";
//lo usamos como prevencion de cambios o errores
struct Contacto{
char nombre[30];
char apellido[45];
int edad;
char correo[45];
};
/*********** FUNCIONES DEL PROGRAMA ****************/
void ingresarContacto(Contacto c);
Contacto leerContacto();
bool existeContacto(char nombre[],char apellido[]);//3
Contacto buscarContacto(char nombre[],char apellido[]);//4
void mostrarContacto(Contacto c);
void listarContacto();
void eliminarContacto(char nombre[],char apellido[]);
void actualizarContacto(char nombre[],char apellido[]);
/***************************************************/
int main(){
listarContacto();
Contacto c= leerContacto();
ingresarContacto(c);
int num; /*con esta variable vamos a controlar el menú y para esto se van a utilizar dos variables mas que van a ser "a" y "b", con tal que el usuario pueda elegir
que opción desea hacer(registrar, buscar, eliminar y actualizar).*/
char a[25],b[25];
switch (num)
{
case 1: cin.ignore();
Contacto c= leerContacto();
ingresarContacto(c);break;
case 2: listarContacto();break;
case 3:cin.ignore();
cout<<"Digite nombre del contacto que desea buscar: ";//Solicitamos los datos al usuario en cada una de las opciones.
cin.getline(a,25);
cout<<"Digite apellido del contacto que desea buscar: ";
cin.getline(b,25);
if (existeContacto(a,b)){
Contacto c= buscarContacto(a,b);//aqui se busca el contacto ya antes solicitado al usuario, y se muestra mas adelante.
mostrarContacto(c);
}
else{
cout<<"No se encuentra en la agenda";
}break;
case 4:cin.ignore();
cout<<"Digite nombre del contacto que desea eliminar: ";
cin.getline(a,25);
cout<<"Digite apellido del contacto que desea eliminar: "<<endl;
cin.getline(b,25);
eliminarContacto(a,b);
cout<<"el contacto ha sido eliminado";
break;
case 5:cin.ignore();
cout<<"Digite nombre del contacto que desea actualizar: ";
cin.getline(a,25);
cout<<"Digite apellido del contacto que desea actualizar: ";
cin.getline(b,25);
actualizarContacto(a,b);
cout<<"El contacto ha sido actualizado";
break;
default:
break;
}
return 0;
}
void ingresarContacto(Contacto c){
ofstream salida;
salida.open(DIR_ARCHIVO,ios::binary | ios::app);
salida.write((char*)&c,sizeof(Contacto));
salida.close();
}
bool existeContacto(char nombre[],char apellido[]){
Contacto c;
ifstream entrada;
entrada.open(DIR_ARCHIVO,ios::binary);
if(entrada.good()){
while(entrada.read((char*)&c,sizeof(Contacto))){
/**strcmp -> comparacion de cadenas**/
if(strcmp(nombre,c.nombre)==0 && strcmp(apellido,c.apellido)==0){ //0 son iguales, 1 si el primero es mayor q el segundo y -1 si es menor
entrada.close(); //Ojo con el orden de las instrucciones
return true;
}
}
entrada.close();
return false;
}
else{
entrada.close();
return false;
}
}
Contacto buscarContacto(char nombre[],char apellido[]){
Contacto c;
ifstream entrada;
entrada.open(DIR_ARCHIVO,ios::binary);
if(entrada.good()){
while(entrada.read((char*)&c,sizeof(Contacto))){
/**strcmp -> string comparison -> comparacion de cadenas**/
if(strcmp(nombre,c.nombre)==0 && strcmp(apellido,c.apellido)==0){
entrada.close();
return c; //debe retornar el contacto
}
}
}
}
Contacto leerContacto(){
Contacto c;
cout<<"\t\t\tNOMBRE : ";
cin.getline(c.nombre,30);
cout<<"\t\t\tAPELLIDO : ";
cin.getline(c.apellido,45);
cout<<"\t\t\tEDAD : ";
cin>>c.edad;
cin.ignore();
cout<<"\t\t\tCORREO : ";
cin.getline(c.correo,45);
return c;
}
void mostrarContacto(Contacto c){
cout<<endl;
cout<<"\t\t\t NOMBRE : "<<c.nombre<<endl;
cout<<"\t\t\t APELLIDO : "<<c.apellido<<endl;
cout<<"\t\t\t EDAD : "<<c.edad<<endl;
cout<<"\t\t\t CORREO : "<<c.correo<<endl;
cout<<endl;
}
void listarContacto(){
ifstream entrada;
entrada.open(DIR_ARCHIVO,ios::binary);
Contacto c;
if(entrada.good()){
while(entrada.read((char*)&c,sizeof(Contacto))){
mostrarContacto(c);
}
}
else{
cout<<"No se puede leer el archivo"<<endl;
}
entrada.close();
}
void eliminarContacto(char nombre[],char apellido[]){
ifstream entrada; //a
ofstream temporal;
entrada.open(DIR_ARCHIVO,ios::binary);//b.
temporal.open("temp.dat",ios::binary);//i
Contacto c; //c
if(entrada.good()){ //d
while(entrada.read((char*)&c,sizeof(Contacto))){//e
if(strcmp(nombre,c.nombre)!=0 || strcmp(apellido,c.apellido)!=0){//f -J deben ser diferente
temporal.write((char*)&c,sizeof(Contacto));//k
/*H como se guardan los registros:
* !
REGISTRO1REGISTRO2REGISTRO3
lee primer registro y no puede devolver
* creo otro archivo q sea temporal q copie la info q no quiero eliminar
*/
}
}
}
entrada.close();//g
temporal.close();//l
remove(DIR_ARCHIVO);//m deseo eliminar el archivo orginal
rename("temp.dat",DIR_ARCHIVO);//n renombaralo
}
void actualizarContacto(char nombre[],char apellido[]){
/**
contactos.dat |
REGISTRO1REGISTRO2REGISTRO3
temp.dat |
REGISTRO1REGISTRONREGISTRO3
**/
ifstream entrada;
ofstream temporal;
entrada.open(DIR_ARCHIVO,ios::binary);
temporal.open("temp.dat",ios::binary);
Contacto c;
if(entrada.good()){
while(entrada.read((char*)&c,sizeof(Contacto))){
if(strcmp(nombre,c.nombre)==0 && strcmp(apellido,c.apellido)==0){
Contacto actualizado = leerContacto();
temporal.write((char*)&actualizado,sizeof(Contacto));
}
else{
temporal.write((char*)&c,sizeof(Contacto));
}
}
}
entrada.close();
temporal.close();
remove(DIR_ARCHIVO);
rename("temp.dat",DIR_ARCHIVO);
}