Soy estudiante de grado superior de programación y me han mandado este ejercicio para hacer.
Una "gestion" en al que se tiene que guardar el nombre, apellido y DNI de los trabajadores, y luego una funcion, para listarlos por orden de DNI. para ello creo un mapa con una clave y una posicion que sera la que se ha guardado en el fichero, para que sea mas rapido a la hora de listar. Pues bien, no se si es problema del programa, del compilador o de que, pero a la hora de listarlos, solo me aparece el ultimo registro que introduzco, y ademas al salir del programa en el mapa no se cargan los datos, pero dos variables que utilizo para ver cuantos datos hay guardados si que se me guardan bien.
Dejo el codigo aqui. Cualquier duda de alguna parte del codigo avisarme.
Código C++:
Ver original
#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(); }