4
« en: 20 de Abril 2015, 11:02 »
Hola, muchísimas gracias por responde. He conseguido hacer el método modificar. Ahora lo que me da un fallo es el eliminar.
Lo que hago es introducir el id del paciente que quiero eliminar, lo coge, se posiciona en el que quiero eliminar y desplaza el resto d pacientes. Pero cuando le doy a la opción de consultar, para ver si el eliminar se ha hecho correctamente, me pilla como basura.
Por favor, podéis echarle un vistazo, haber que me puede estar fallando.
Este es el .cpp
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include "clinica.h"
using namespace std;
typedef char DATA_TYPE;
/*Un objeto Clínica está vinculado a un fichero, siendo el constructor el método en el que se
debe abrir tal fichero, según la cadena pasada como parámetro (con el nombre del fichero
físico). Si tal fichero ya existiera se leería el valor de numPacientes, y si no, se procedería a
crearlo (asignando y guardando el valor de 0 para el número de pacientes).*/
clinica::clinica(char nombrefichero[]){
//abrir ficheo y cargar numero de pacientes, si no existe, que este a 0
fichero.open(nombrefichero,ios::binary|ios::in|ios::out);
if(!fichero.fail())
{
fichero.read((char*) &numpacientes, sizeof(numpacientes));
//fichero.close();
}
else
{
cout<<"Error en la apertura del fichero\n";
FILE *ffichero2;
ffichero2=fopen(nombrefichero, "w+b");
fputc(0,ffichero2);
numpacientes=0;
fclose(ffichero2);
/* fstream fichero2;//creamos fichero2
fichero2.open(nombrefichero,ios::binary|ios::in|ios::out);//abrimos el fichero2 en modo binario
fichero2<<"0"<<endl;//Escibimos un 0
numpacientes=0;
fichero2.close(); cerramos el fichero2*/
}
};
/*El método privado posicionar se encarga de situarse en el fichero en el inicio del paciente p
pasado como parámetro. Dicho método recibe como parámetro, bajo el parámetro oper,
valores ‘R’ para posicionamiento para lectura o de ‘W’ para posicionamiento para escritura.*/
void clinica::posicionar(int p, char oper){
paciente pa;
int num;
int i=0;//indice
fichero.seekg(0, ios::beg);
fichero.read((char*) &num, sizeof(int));
while(i<num){
fichero.read((char*) &pa, sizeof(pa));
cout <<"paciente-->"<< pa.id <<" "<<pa.nombre<<endl;
if(pa.id==p){
if(oper=='W'){
fichero.seekp(0,ios::cur);//Se ha posicionado correctamente para la escritura
break;
}else if(oper=='R'){
fichero.seekg(0,ios::cur);//Se ha posicionado correctamente para la lectura
break;
}
}
i++;
}
if(i==num){
fichero.seekg(0, ios::beg);
cout<<"No se encuentra el paciente"<<endl;
}
};
/*El método consultar se encarga de mostrar por pantalla los datos de todos los pacientes cuyos
apellidos comiencen por el carácter pasado por parámetro (si nos pasan * sería mostrar todos).*/
void clinica::consultar(char inicial){
paciente pa;
int num;
fichero.seekg(0, ios::beg);
fichero.read((char*) &num, sizeof(num));
cout<<num<<endl;
system("pause");
for(int i=0;i<num;i++){
fichero.read((char*) &pa, sizeof(pa));
if(inicial=='*')
{
cout<<pa.apellidos<<pa.id<<endl;
system("pause");
}
else
{
if(inicial==pa.apellidos[0])
{
cout<<"El apellido que comienza por la "<<inicial<< " es "<<pa.apellidos<<endl<<endl;
}
}
}
};
/*
El método insertar realiza la inserción de los datos de un nuevo paciente, a continuación del
último de los ya existentes.
*/
void clinica::insertar(paciente p){
fichero.seekg(0, ios::end);
fichero.write((char*) &p, sizeof(p));
numpacientes=numpacientes+1;
fichero.seekp(0, ios::beg);
fichero.write((char*) &numpacientes, sizeof(numpacientes));
};
/*El método modificar se encarga de actualizar los datos del paciente cuyo identificador se pasa
por parámetro, pidiendo dichos datos previamente. Si el identificador no estuviera en el
fichero de pacientes, se mostraría un mensaje al respecto.*/
void clinica::modificar(int id){
paciente pa;
posicionar(id,'W');
pa.id=id;
cout<<"Dame nombre del paciente"<<endl;
cin>>pa.nombre;
cout<<"Dame apellidos del paciente"<<endl;
cin>>pa.apellidos;
cout<<"Dame edad del paciente"<<endl;
cin>>pa.edad;
fichero.write((char*) &pa, sizeof(pa));
cout<<"La escritura se ha hecho correctamente"<<endl;
};
/*El método eliminar realiza la eliminación del paciente cuyo identificador se pasa por
parámetro. Si el identificador no estuviera en el fichero de pacientes, se mostraría un mensaje
al respecto. Para eliminar un paciente del fichero, se desplazan una posición a la izquierda
todos los pacientes existentes a continuación del que se elimina (para no dejar huecos).*/
void clinica::eliminar(int id){
paciente pa;
posicionar(id,'W');
// fichero.read((char*) &pa, sizeof(pa));
int pos=0;
// fichero.seekg(0,ios::cur);
//cout<<"llego"<<endl;
while(fichero.eof()==0){
cout<<"entro en el while"<<endl;
fichero.read((char*) &pa, sizeof(pa));
cout<<"he leido"<<pa.id<<endl;
fichero.seekp(-sizeof(pa),ios::cur);
fichero.write((char*) &pa, sizeof(pa));
cout<<"he escrito"<<pa.id<<endl;
//pos++;
//fichero.seekg(sizeof(pa),ios::cur);
//system("pause");
}
fichero.seekp(0,ios::beg);
fichero.seekg(0,ios::beg);
numpacientes--;
fichero.write((char*) &numpacientes, sizeof(int));
};
Desde el main llamo al método asi:
case 4:
cout<<"Introduzca id:"<<endl;
cin>>id;
cli.eliminar(id);
break;
Gracias.