Dev - C++ - Ayuda metodo posicionar

   
Vista:

Ayuda metodo posicionar

Publicado por chica_ing (6 intervenciones) el 16/04/2015 12:05:58
Hola tengo que hacer un método posicionar y no se muy bien como hacerlo. Por favor me podríais ayudar?
Esto es lo que me piden:
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.

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Ayuda metodo posicionar

Publicado por vangodp (287 intervenciones) el 16/04/2015 15:16:38
Nos aportas muy pocos datos para que te podamos ayudar.
Deberías poner lo que llevas echo o quizás todo el proyecto de lo que se te pide.

Lo que da a entender es que quieren más o menos algo asi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class paciente {
    public:
 
    private:
        void posicionar ( paciente p, char open ) {
            fichero = fopen ( "nombreFichero.txt", open );
            if ( fichero != NULL ){
                cout << "El fichero esta abierto" << endl;
            }else{
                cout << "El fichero no se abrio" << endl;
            }
 
        }
 
};

Aun que con lo poco que nos aportas será difícil ayudarte así.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda metodo posicionar

Publicado por chica_ing (6 intervenciones) el 16/04/2015 15:24:46
Muchisimas gracias por contestar.
Esto es lo que llevo hecho d mi proyecto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#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){
 
};
/*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));
 
	for(int i=0;i<num;i++){
	   fichero.read((char*) &pa, sizeof(pa));
 
	   if(inicial=='*')
	   {
	   		cout<<pa.apellidos<<endl;
	   }
	   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.seekg(0, ios::beg);
 
	fichero.write((char*) &numpacientes, sizeof(numpacientes));
 
};


Espero que con eso puedan ayudarme.
Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda metodo posicionar

Publicado por vangodp (287 intervenciones) el 16/04/2015 22:00:04
Me sigues soltando comentarios a cuenta gotas.
Cosas como:
¿Quien llama a void clinica::posicionar() si es privada?
¿paciente p qué es?
El método posicionar recibe R y W, pero ignoro que tiene que hacer con eso por que no se el nombre del fichero.

No se falta mucha información.

Crees que con:
/*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.*/

...No voy a poder hacer nada sin saber como son las clases clinica y paciente.

A tanto no llego. Necesito más que nada la interfaz de ambas clases con sus variables herencia etc etc, y una breve explicación de lo que hace cada cosa en vez de ver que hacen sus metodos, por que no se con que datos tengo que trabajar.

O me pasas la interface para que me entere de lo que se trata o a ver si alguien sabe lo que necesitas, lo siento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Carlos

Ayuda metodo posicionar

Publicado por Juan Carlos (8 intervenciones) el 16/04/2015 23:23:34
¿Que dato del paciente se envia en P? ¿su codigo, su nombre, o algun otro dato?
Si envias el resto del programa o almenor el peograma principal seria mejor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda metodo posicionar

Publicado por vangodp (287 intervenciones) el 17/04/2015 03:43:46
más bien me interesa saber el nombre del fichero al que se supone que ella debe situarlo al principio. Lo que me intriga es que la funcion que ella quiere es privada. O sea que a esta le va invocar otra funcion/constructor, debo saber como esta esta para poder poner el cursor al principio del fichero como ella quiere.

Es un rollo que te pregunten cosas pero no te pasen el codigo completo pff

Lo mejor es que ella pase la tarea y así se puede tener una idea de lo que pide.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda metodo posicionar

Publicado por chica_ing (6 intervenciones) el 17/04/2015 11:31:19
Gracias por vuestras respuestas. Os pongo el .cpp, el .h y adjunto el enunciado.

Este es el .cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#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;
 
	fichero.seekg(0, ios::beg);
	fichero.read((char*) &num, sizeof(int));
 
	for(int i=0;i<num-2;i++){
			fichero.read((char*) &pa, sizeof(pa));
	cout <<"paciente-->"<< pa.id <<"  "<<pa.nombre<<endl;
	}
 
	fichero.read((char*) &pa, sizeof(pa));
	cout << pa.id <<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));
 
	for(int i=0;i<num;i++){
	   fichero.read((char*) &pa, sizeof(pa));
 
	   if(inicial=='*')
	   {
	   		cout<<pa.apellidos<<endl;
	   }
	   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.seekg(0, ios::beg);
 
	fichero.write((char*) &numpacientes, sizeof(numpacientes));
 
 
};

Este es el .h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <fstream>
#include <iostream>
using namespace std;
 
const int TAM_CADENA = 30;
typedef char cadena[TAM_CADENA];
 
struct paciente{
	int id;
	cadena nombre;
	cadena apellidos;
	int edad;
};//nombre de la variable
 
class clinica{
	private:
		fstream fichero;
		int numpacientes;
		//void posicionar(int p, char oper);
 
	public:
		void posicionar(int p, char oper);
		clinica(char nombrefichero[]);
		int getnumpacientes()
				{
					return numpacientes;
				};
		void consultar(char inicial);
		void insertar(paciente p);
		void modificar(int id);
		void eliminar(int id);
		void simularoperaciones();
 
};
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda metodo posicionar

Publicado por chica_ing (6 intervenciones) el 19/04/2015 21:13:03
Por favor alguien que pueda ayudarme?
Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda metodo posicionar

Publicado por Patricia (1 intervención) el 20/04/2015 19:53:23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include"clinica.h"
#include<stdlib.h>
#include"quirofano.h"
//para las funciones genericas/////////////
const int TIEMPO = 2000;
const int TAM_CADENA = 30;
typedef char cadena[TAM_CADENA];
 
 
int azar(int n) {
    return (rand()%n + 1); //se genera un número aleatorio entre 1 y n
}
 
 
bool pacienteOperado() {
     return (azar(TIEMPO) == 1); //si el valor generado es 1..se considera operado, sino sigue operándose
}
 
//fin funciones genericas		 
Clinica::Clinica(char nombreFichero[]) {
fichero.open(nombreFichero, ios::in | ios::out | ios::binary);
if(fichero.fail()){   //si peta
cout<<"\nEl fichero peto, hay que hacer otro\n";
	fichero.close();// primero se cierra
	fichero.clear();//despues se borra la info del fallo
	fichero.open(nombreFichero, ios::out | ios::binary);//se crea otra si fallo
	numPacientes=0;
	fichero.write((char*) &numPacientes,sizeof(int));
	fichero.close();
	fichero.open(nombreFichero, ios::in | ios::out | ios::binary);
}
else{
//	cout<<"\nFichero ya estaba creado \n\n";
 	fichero.read((char *) &numPacientes, sizeof(int));
	}
	system("pause");
	system("cls");
}
 
void Clinica::posicionar(int p,char oper) {
 
 
switch(oper){
	case 'R':
		case 'r':
				  fichero.seekg(sizeof(int)+sizeof(Paciente)*(p-1),ios::beg); //nos posicionamos en lo que valga int + la struct *(num que nos pasa-1)
			 	 break;
	 case 'W':
	 case 'w':
				 fichero.seekp(sizeof(int)+sizeof(Paciente)*(p-1),ios::beg);
		 	 break;
 
	   }
 
}
 
void Clinica:: consultar ( char inicial ) {
 Paciente pa;
	bool encontrado=false;
	posicionar(1,'r');
for(int i=0; i<numPacientes;i++){//modificar 10 por numPacientes
 
   fichero.read((char *) &pa,sizeof(Paciente));// he copiado lo que hay en fichero en un struc llamado pa, es decir me lo llevo a memoria y curro con el
   if(inicial=='*') {
				encontrado=true;
			cout<<"\nNombre: "<<pa.nombre<<" Apellido: "<<pa.apellidos<<" Edad: "<<pa.edad<<" Identificacion: "<<pa.id<<" La i= "<<i<<"\n";
			 }
   else if(inicial==pa.apellidos[0]) {
 
			cout<<"\nNombre: "<<pa.nombre<<" Apellido: "<<pa.apellidos<<" Edad: "<<pa.edad<<" Identificacion: "<<pa.id<<"\n";
			  encontrado=true;
}
 
 
}
  if(!encontrado) cout<<"\nNo se ha encontrado\n";
   system("pause");
   system("cls");
}
 
void Clinica::insertar(Paciente p){
	Paciente x;
	posicionar(1,'r');
	int i=0;
	bool encontrado=false;
	while(i<numPacientes && !encontrado){
	fichero.read((char *) &x,sizeof(Paciente));
		if(x.id==p.id)
			encontrado=true;
 
			i++;
	}
	i++;
	cout<<"la i vale: "<<i;
	if(!encontrado){
	 numPacientes++;
	posicionar(i,'W');
	fichero.write((char*)&p,(sizeof(Paciente)))    ;//escribir en fichero lo que hay en p, cuya longitud es Paciente
 
	 fichero.seekg(0,ios::beg);
	fichero.write((char *) &numPacientes,(sizeof(int)));
}
	else cout<<"\nEl paciente ya existia\n";
	system("pause");
	system("cls");
}
 
 
void Clinica::modificar(int id){
	Paciente pa;
	bool encontrado=false;
	int i=1;
	posicionar(1,'r');
	while(i<=numPacientes && !encontrado){
		fichero.read((char *) &pa,sizeof(Paciente));
		if(pa.id==id) encontrado=true;
		 i++;
	}
 
	if(!encontrado) cout<<"El paciente no ha sido encontrado\n";
	else{
		posicionar(i,'w');
		cout<<"Escriba el nuevo nombre: ";
		cin>>pa.nombre;
		cout<<"Escriba el nuevo apellido: ";
		cin>>pa.apellidos;
		cout<<"Escriba la nueva edad: ";
		cin>>pa.edad;
		fichero.write((char*)&pa,(sizeof(Paciente)));
	}
 
	system("cls");
}
 
 
void Clinica::eliminar(int id){
	Paciente x;
	int posicion;
	posicionar(1,'r');
	int i=1;
	bool encontrado=false;
	while(i<=numPacientes && !encontrado){
		fichero.read((char *) &x,sizeof(Paciente));
		if(x.id==id) {
		 encontrado=true;
		 posicion=i;  } //la posicion encontrada a eliminar
		else
		 i++;
	}
if(encontrado){
while(posicion<numPacientes){
posicionar(posicion+1,'r');
fichero.read((char*)&x,(sizeof(Paciente)));
posicionar(posicion,'w');
fichero.write((char *) &x,(sizeof(Paciente)));
posicion++;
}
numPacientes--;
fichero.seekg(0,ios::beg);
fichero.write((char *) &numPacientes,(sizeof(int)));
 
	}
}
 
void Clinica::simularOperaciones(){
	Quirofano tabla[3];
	Paciente x;
	posicionar(1,'r');
	for(int i=0;i < numPacientes ;i++){
		fichero.read((char *) &x,sizeof(Paciente));
		tabla[(azar(3)-1)].anadirpaciente(x.id);
		cout<<"n vale: "<<n<<" i vale: "<<i<<"\n";
	}
/*	
	do{
system("cls");
	
cout<<" quirofano 1: " <<tabla[0].numpacientes() <<"\n";
cout<<" quirofano 2: " <<tabla[1].numpacientes() <<"\n";	
cout<<" quirofano 3: " <<tabla[2].numpacientes() <<"\n";	
	while(tabla[0].quirofanovacio() && tabla[1].quirofanovacio && tabla[2].quirofanovacio());
	 system("pause");
	 */
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda metodo posicionar

Publicado por chica_ing (6 intervenciones) el 20/04/2015 20:11:59
Muchísimas gracias por tu ayuda, ahora mismo voy a probar si por fin me funciona el posicionar..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda metodo posicionar

Publicado por chica_ing (6 intervenciones) el 21/04/2015 13:10:16
Ayer estuve probando la función y va perfecto. Muchísimas gracias Patricia, me ha sido de gran ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar