Autor
|
Tema: Leer archivos de acceso aleatorio con reinterpet_cast (Leído 6,054 veces)
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Hola en este codigo: #include "stdafx.h" #include <iostream> #include <fstream> #include <string> using namespace std; class name{ string n; public: name(string N=""):n(N){} string getName()const{return n;} }; int _tmain(int argc, _TCHAR* argv[]) { fstream file("data.dat",ios::in | ios::out | ios::binary); name N; file.seekg(0); file.read(reinterpret_cast<char *>(&N),sizeof(name)); if(!file.fail()) cout << "Good!"; getchar(); return 0; }
Despues de ejecutar un programa para crear el archivo he insertar en el la clase name simplemente por probar porque pasa esto y ahora en este programa cuando termina creo que se ejecuta el destructor de file y me lanza un error de infraccion de acceso de memoria Excepción no controlada en 0x51DDCCC8 (msvcp110d.dll) en Files_random_acces.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x01278B9C.Como solucionar esto? Saludos
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
file.seekg(0);
¿Para que pones esto? Por defecto siempre se empieza en la posición cero. Y en cuanto al error, en un string no puedes escribir directamente. Tienes que llamar a sus métodos/operadores y ellos se encargan de hacer sus gestiones con la memoria dinámica. Podría funcionar así: #include "stdafx.h" #include <iostream> #include <fstream> using namespace std; class name { char n[1000]; public: // name(string N=""):n(N) {} char* getName() { return n; } }; int _tmain(int argc, _TCHAR* argv[]) { fstream file("data.dat",ios::in | ios::out | ios::binary); name N; file.read(N.getName(),1000); if(!file.fail()) cout << "Good!"; getchar(); return 0; }
Aún así me parece una práctica muy poco apropiada y poco práctica. PD: ¿Que compilador usas? Lo de t_main me llama la atención.
|
|
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Hola gracias por tu respuesta. pero deberia de funcionar con reinterpet_cast. Y lo de string no se puede guardar con una clase porque tiene memoria dinamica ? Si es asi como lo puedo guardar en un archivo?
Utilizo visual studio 2012.
Saludos
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
String es una clase. Para modificar su array de chars, has de hacerlo mediante los operadres y funciones que string te ofrece.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Y lo de string no se puede guardar con una clase porque tiene memoria dinamica ? Si que se puede, lo que no puedes hacer es escribir en su memoria a lo bruto. Para empezar porque lo que estas haciendo es sobreescribir su puntero (la clase string no guarda el texto, sino el puntero donde tiene reservado el texto). El encapsulamiento y el que haya métodos privados y públicos se hizo por algo. Si quieres adceder al contenido del string, usa sus métodos, si quieres modificarlo usa sus métodos tambien. pero deberia de funcionar con reinterpet_cast. Y lo de string no se puede guardar con una clase porque tiene memoria dinamica ? No debería, ya no solo por lo que te he dicho antes sino porque le has pasado el objeto entero (que tiene más cosas que la clase string). Yo soy muy poco partidario de usar un reinterpet_cast para un objeto, lo ideal es definir un operador char* en la clase. Aunque en este ejemplo no lo necesitas (sigue leyendo). Si es asi como lo puedo guardar en un archivo? Crea este método en la clase: void setNombre(string &texto) { n = texto; }
Y lee el nombre con el operador >> que para eso está (o bien, getline si es una línea entera): fstream file("data.dat",ios::in | ios::out); Name N; string aux; file>>aux; N.setNombre(aux);
|
|
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
La clase name era simplemente por probar, la clase que de verdad queria poner en un archivo es esta: class item{ public: item(){ID=0;} item(int,string,unsigned short int num,double); item(const item &); int showId() const {return ID;} void changeName(string Name); string getName() const {return name;} void changeNum(unsigned short int Num); unsigned short int getNum()const{return num;} void changeMoney(double Money); double getMoney() const {return money;} int getId()const{return ID;} private: int ID; string name; unsigned short int num; double money; };
Si cambio el string por char [1000] como lo hago sin usar reinterpet_cast. Porque no te gusta utilizar reinterpet_cast ? Para leer la clase seria algo como guardar todos sus variables privadas con un tamano fijo y luego recuperar los uno a uno y meterlos en una clase nueva con sus metodos public ? Saludos
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Revisa la clase que hay un método muy interesante: void changeName(string Name);
Blanco y en botella. Usa ese método para cambiar el nombre. Problema resuelto. fstream file("data.dat",ios::in | ios::out); item N; string aux; file>>aux; N.changeName(aux);
Porque no te gusta utilizar reinterpet_cast ? Transformar objetos a datos primitivos es una barbaridad, definirte operadores de conversión es más seguro y efectivo.
|
|
« Última modificación: 15 Marzo 2014, 15:07 pm por amchacon »
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Ya se que tengo el metodo para cambiar el nombre pero no me refiera a esto si no a que cuando se guardan y quiero que sea un conjunto de informacion con tamano fijo para reemplzar con una posicion exacta tengo que sumar los sizeof() de todos las variables de la clase y guardar los uno en uno y luego al leer los tengo que usar algo así: file.seekg((sizeof(int)+1000+sizeof(unsigned short int)+sizeof(double)) file.read(id,sizeof(int))*numero_de_registro);//id=int file.read(name,1000);//name=char[1000] ...
? Y para escribir lo mismo. O también si hago una función que convierte todos los datos en un tipo exacto preparado para ser guardado de una vez en el file. O si hay otro metodo mejor? @Edit: Me acabo de dar cuenta de que file.read() tiene que ser char* el primer argumento y tengo que convertir el int a char*. Algo como esto: char id[sizeof(int)]; file.read(id,sizeof(int));
|
|
« Última modificación: 15 Marzo 2014, 15:36 pm por patilanz »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Haz lo siguiente, definete esta funcion en la clase: void WriteInFile(fstream &file) { file.write((char*)&ID,sizeof(int)); file<<name<<' '; file.write((char*)&num,sizeof(unsigned short)); file.write((char*)&money,sizeof(double)); }
Y para leer lo mismo pero al reves: void ReadInFile(fstream &file) { file.read((char*)&ID,sizeof(int)); file>>name; file.read((char*)&num,sizeof(unsigned short)); file.read((char*)&money,sizeof(double)); }
Lectura/escritura 100% binaria. Supongo que es lo que querías.
|
|
« Última modificación: 15 Marzo 2014, 18:19 pm por amchacon »
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Hola lo probé pero al abrir el archivo con notepad me muestra el texto normal y corriente, así debería de ser en binario? Y al probar lo que me dijiste para guardar un char[100] y un int probe esto: fstream file("data.dat",ios::out | ios::binary); name n; char text[100]={"cosa"}; int numero=2; file << text << ' '; file.write((char*)&numero,sizeof(int));
fstream file("data.dat",ios::in | ios::binary); name n; char text[100]; int numero; file >> text; file.read((char*)&numero,sizeof(int));
El texto me lo hace bien pero el por ejemplo para 2 me devuelve 544 y para 54 13856 y no se porque? Saludos
|
|
« Última modificación: 24 Marzo 2014, 20:44 pm por patilanz »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Threads + Archivos de Acceso Aleatorio y demas yerbas...
Ejercicios
|
agusCarBan
|
0
|
3,980
|
2 Junio 2009, 20:24 pm
por agusCarBan
|
|
|
Listar fichero acceso aleatorio
Programación C/C++
|
sexto
|
2
|
2,403
|
13 Mayo 2010, 08:30 am
por sexto
|
|
|
Acceso aleatorio a archivos binarios, a ver si alguien puede ayudarme
« 1 2 »
Programación C/C++
|
Awraaaauu
|
13
|
8,684
|
24 Junio 2010, 21:14 pm
por nicolas_cof
|
|
|
Leer texto base y generar otro aleatorio {JAVA}
Java
|
drachmatizando
|
0
|
3,245
|
16 Septiembre 2010, 19:24 pm
por drachmatizando
|
|
|
Duda Manejo De Archivos De Acceso Aleatorio
Programación C/C++
|
Omar_2013
|
2
|
2,458
|
1 Abril 2014, 20:22 pm
por Omar_2013
|
|