FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Escribir un objeto en un TFileStream
Hola a todos, tengo el siguiente código en C++:
Código:
class disco { public: int codigo; char titulo[30], interprete[30]; double costo; void menu(); void captura(); void muestra(); void busca(); void modifica(); void elimina(); } x; void disco::captura() { cout << "Codigo : "; cin >> codigo; cout << "Titulo : "; gets(titulo); cout << "Interprete : "; gets(interprete); cout << "Costo : "; cin >> costo; ofstream escritor("D:\\disco.txt", ios::app); escritor.write((char *)&x, sizeof(x)); escritor.close(); } void disco::muestra() { ifstream lector("D:\\disco.txt"); while(!lector.eof() && !lector.fail()) { lector.read((char *)&x, sizeof(x)); if(lector.eof()) break; cout << "\nCodigo : " << codigo; cout << "\nTitulo : " << titulo; cout << "\nInterprete : " << interprete; cout << "\nCosto : " << costo; cout << endl; } getch(); } Código:
escritor.write((char *)&x, sizeof(x)); lector.read((char *)&x, sizeof(x)); Aqui le muestro una de tantas formas con las cuales traté de hacerlo, pero no funciona (la clase no es la misma del código de C++): Código:
unit JoyClassU; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; const arcDATOS = 'Clientes.txt'; type TNombre = String[50]; TDireccion = String[100]; TDescripcion = String[200]; TCliente = class public Nombre : TNombre; Deuda : Integer; Direccion : TDireccion; Descripcion : TDescripcion; constructor Create(Nom : TNombre; Deu : Integer; Dir : TDireccion; Des : TDescripcion); procedure Guarda; function Busca(Nom : TNombre) : TStrings; end; implementation constructor TCliente.Create(Nom : TNombre; Deu : Integer; Dir : TDireccion; Des : TDescripcion); begin inherited Create; Nombre := Nom; Deuda := Deu; Direccion := Dir; Descripcion := Des; end; procedure TCLiente.Guarda; var Archivo : TFileStream; begin Archivo := TFileStream.Create(arcDATOS, fmOpenReadWrite); Archivo.Seek(0, soFromEnd); Archivo.WriteBuffer(Self, SizeOf(TCliente)); Archivo.Free; end; function TCLiente.Busca(Nom : TNombre) : TStrings; var Archivo : TFileStream; tsClientes : TStrings; inBandera : Integer; begin Archivo := TFileStream.Create(arcDATOS, fmOpenRead); tsClientes := TStringList.Create; while Archivo.Position < Archivo.Size do begin Archivo.ReadBuffer(Self, SizeOf(TCliente)); ShowMessage(Nombre); if Pos(Nom, Nombre) <> 0 then begin inBandera := 1; tsClientes.Add(Nombre); end; end; Archivo.Free; Result := tsClientes; end; end. Ojalá me haya dado a entender, lo que quiero saber, es cómo escribir y leer un objeto en un archivo, ando muy perdido . Saludos dvz |
#2
|
||||
|
||||
Una solución fácil, aunque no muy óptima, es que tus objetos hereden de TComponent. Los streams tienen la facilidad de poder guardar los datos de un TComponent, esto esta hecho para poder leer y guardar los datos del DFM utilizando las clases TWriter y TReader:
Código:
var MiObjeto: TComponent; begin FStream.WriteComponent(MiObjeto); end; Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
|||
|
|||
Muchas gracias por su interés e información delphi.com.ar, lo del Record fué la opción que utilicé para solucionar la cuestión.
Nuevamente gracias. dvz |
#4
|
||||
|
||||
Podes "especializar" las clases, creando un método WriteToStream que almacene toda la información que necesitas volver persistente, y un ReadFromStream que haga la misma función. O bien derivarlos de TPersistent y hacer un override de estos mismos métodos.
Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
|