#include <iostream>
#include <map>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
using namespace std;
typedef struct ficha
{
int dni;
char nombre[25];
char apellidos[25];
} persona;
typedef struct mapas
{
int clave;
int pos;
}mapa;
typedef struct posiciones
{
int pa;
int pb;
}punteros;
void construir (map <int,int> & claves,int & pa,int & pb,vector<int> pila);
void guardar (map <int,int> claves,int pa,int pb,vector<int> pila);
void altas(map<int,int> & claves, int & pa, int &pb,vector<int> pila);
void bajas(map<int,int> & claves,int & pb, vector<int> pila);
void listar(map<int,int> claves);
int main()
{
int pa=0,pb=0,z;
map <int,int> claves; //clave DNI, 2º campo posicion en la que se encuentra
vector<int> pila;
map<int,int>::iterator itm;
construir(claves,pa,pb,pila); //recupera los datos de los ficheros.
do
{
cout<<"Elige la opcion a realizar."<<endl;
cout<<"1.- Alta de Trabajador."<<endl;
cout<<"2.- Baja de Trabajador."<<endl;
cout<<"3.- Listado de Trabajadores."<<endl; //lista de los trabajadores ordenados por DNI
cout<<"4.- Prueba de mapa."<<endl;
cout<<"0.- Salir."<<endl;
cin>>z;
switch(z)
{
case 1:
altas(claves,pa,pb,pila); //dar de alta un usuario
break;
case 2:
bajas(claves,pb,pila); //dar de baja un usuario
break;
case 3:
listar(claves); //lista de los trabajadores ordenados por DNI
break;
case 4: //lista los registros que hay en el mapa.
for(itm=claves.begin();itm!=claves.end();itm++)
{
cout<<(*itm).first<<"---"<<(*itm).second<<endl<<endl;
}
break;
}
}
while(z!=0);
guardar(claves,pa,pb,pila); //guarda los datos en los ficheros-
return 0;
}
void construir (map <int,int> & claves,int & pa,int & pb,vector<int> pila)
{
/*------------------------------------------------------Claves-----------------------------------------*/
fstream fclave;
mapa modelo;
int pos;
fclave.open("C:\\ficheros\\ejercicio3\\claves.txt",ios::in | ios::binary);
if(!fclave)
{
fclave.close();
fclave.open("C:\\ficheros\\ejercicio3\\claves.txt",ios::out | ios::binary);
}
else
{
pos=0;
fclave.seekg((pos)*sizeof(mapa));
fclave.read(reinterpret_cast<char *>(&modelo), sizeof(mapa));
while(!fclave)
{
claves.insert(pair<int, int>(modelo.clave,modelo.pos));
fclave.read(reinterpret_cast<char *>(&modelo), sizeof(mapa));
}
}
fclave.close();
/*-------------------------------------------------------Pila-----------------------------------------*/
fstream fpila;
fpila.open("C:\\ficheros\\ejercicio3\\pila.txt",ios::in | ios::binary);
if(!fpila)
{
fpila.close();
fpila.open("C:\\ficheros\\ejercicio3\\pila.txt",ios::out | ios::binary);
}
else
{
while(!fpila)
{
fpila.read(reinterpret_cast<char *>(&pos), sizeof(int));
pila.push_back(pos);
}
}
fpila.close();
/*------------------------------------------------------Indices---------------------------------------*/
fstream findices;
punteros punt;
findices.open("C:\\ficheros\\ejercicio3\\indices.txt",ios::in | ios::binary);
if(!findices)
{
findices.close();
findices.open("C:\\ficheros\\ejercicio3\\indices.txt",ios::out | ios::binary);
pa=0;
pb=0;
}
else
{
pos=0;
findices.seekg((pos)*sizeof(punteros));
findices.read(reinterpret_cast<char *>(&punt),sizeof(punteros));
pa=punt.pa;
pb=punt.pb;
}
findices.close();
cout <<"pa: "<<pa << " pb: " <<pb<<endl;
}
/*---------------------------------------------------------------------------------------------------------------------------------------*/
void altas(map<int,int> & claves, int & pa,int & pb,vector<int> pila)
{
persona trabajador;
fstream fdatos;
int pos;
cout<<"Introduzca el DNI del trabajador"<<endl;
cin>>trabajador.dni;
cout<<"Introduzca el Nombre del trabajador"<<endl;
cin>>trabajador.nombre;
cout<<"Introduzca el Apellido del trabajador"<<endl;
cin>>trabajador.apellidos;
if(pb==0)
{
pos=pa;
claves.insert(pair<int, int>(trabajador.dni, pos));
pa++;
}
else
{
pos=pila.back();
claves.insert(pair<int, int>(trabajador.dni, pos));
pb--;
pila.pop_back();
}
fdatos.open("C:\\ficheros\\ejercicio3\\datos.txt",ios::out | ios::binary);
fdatos.seekp((pos)*sizeof(persona));
fdatos.write(reinterpret_cast<char *>(&trabajador),sizeof(persona));
fdatos.close();
}
/*---------------------------------------------------------------------------------------------------------------------------------------*/
void bajas(map<int,int> & claves,int & pb, vector<int> pila)
{
persona trabajador;
map<int,int>::iterator itr;
cout<<"Introduzca el DNI del trabajador que desea dar de baja."<<endl;
cin>>trabajador.dni;
itr=claves.find(trabajador.dni);
pila.push_back ((*itr).second);
claves.erase(itr);
pb++;
}
/*---------------------------------------------------------------------------------------------------------------------------------------*/
void listar(map<int,int> claves)
{
map<int,int>::iterator itr;
persona trabajador;
fstream fdatos;
fdatos.open("C:\\ficheros\\ejercicio3\\datos.txt",ios::in | ios::binary);
int pos;
for(itr=claves.begin();itr!=claves.end();itr++)
{
pos=(*itr).second;
fdatos.seekg((pos)*sizeof(persona));
fdatos.read(reinterpret_cast<char *>(&trabajador),sizeof(persona));
cout<<"Nombre: "<<trabajador.nombre<<" "<<trabajador.apellidos<<endl<<"DNI: "<<trabajador.dni<<endl<<endl;
}
fdatos.close();
}
/*---------------------------------------------------------------------------------------------------------------------------------------*/
void guardar (map <int,int> claves,int pa,int pb,vector<int> pila)
{
fstream fclave;
mapa modelo;
map<int,int>::iterator itm;
punteros punt;
int pos=0;
fclave.open("C:\\ficheros\\ejercicio3\\claves.txt",ios::out | ios::binary | ios::trunc);
for(itm=claves.begin();itm!=claves.end();itm++)
{
modelo.clave=(*itm).first;
modelo.pos=(*itm).second;
fclave.seekp((pos)*sizeof(mapa));
fclave.write(reinterpret_cast<char *>(&modelo),sizeof(mapa));
pos++;
}
fclave.close();
/*-------------------------------------------------------Pila-----------------------------------------*/
fstream fpila;
vector<int>::iterator itv;
pos=0;
fpila.open("C:\\ficheros\\ejercicio3\\pila.txt",ios::out | ios::binary);
for(itv=pila.begin();itv!=pila.end();itv++)
{
fpila.seekp((pos)*sizeof(int));
fpila.write(reinterpret_cast<char *>(&(*itv)),sizeof(int));
pos++;
}
fpila.close();
/*------------------------------------------------------Indices---------------------------------------*/
fstream findices;
findices.open("C:\\ficheros\\ejercicio3\\indices.txt",ios::out | ios::binary);
pos=0;
punt.pa=pa;
punt.pb=pb;
findices.seekp((pos)*sizeof(punteros));
findices.write(reinterpret_cast<char *>(&punt),sizeof(punteros));
findices.close();
}