• Lunes 29 de Abril de 2024, 01:38

Autor Tema:  Guardar Registros En C++  (Leído 4576 veces)

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Guardar Registros En C++
« en: Miércoles 16 de Agosto de 2006, 00:23 »
0
Miren este es mi problema . quiero crear un registro que en este caso es una clase asi:
class TItem{
private:
 String name;
 String apellido;
}

y ahora quiero guardarlo en un archivo digamos PRUEBA.txt y despues leerlo pero como hago eso. Tengo entendido que se usa fwrite y fread pèro ,al momento que hago fwrite todo sale bien , y al momento q leo pues no sale nada .. no se si es porque yo abro el archivo haci
fopen("PRUEBA.txt","a"); asi para agregar un registro y para leerlo asi:

TItem a;
FILE archivo;
 fread(&a,sizeof(a),1,archivo);

medio extraño .. si pueden ayudarme haganlo porfavor.

pilarm

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #1 en: Miércoles 16 de Agosto de 2006, 01:27 »
0
Hola..

Creo q tu problema radica porque el modo de apertura "a" lo posiciona en el ultimo registros, claro  el te agrega bien porq estas en lo ultimo del archivo, pero cuando quieres leer no puedes porque ya no hay mas nada que leer

Puedes solucionarlo con el fseek, luego de escribir, posicionas el puntero en la primera posicion!!! o abrirlo en otro modo.

Espero te sirva!!!

 :hola:

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #2 en: Miércoles 16 de Agosto de 2006, 01:40 »
0
Mira pilar ya intente lo q me dijiste peroooo adivina NO SALE NADA :( saben estoy trabajando en C++ Builder pero no funciona no se ya le aplique fseek(file,0L,SEEK_SET);        y nada .. algun tio q sepa de esto??

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #3 en: Miércoles 16 de Agosto de 2006, 04:27 »
0
Ya probaste lectura/escritura con "rb+" o "r+" ? podría funcionar...

Vatoicc

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #4 en: Jueves 17 de Agosto de 2006, 04:46 »
0
Si estas programando en C++ builder, creo que seria mas facil usar un objeto TStringList

Código: Text
  1.  
  2.    TStringList *Archivo = new TStringList();
  3.    
  4.    //Puedes ir añadiendo linea a linea la informacion en el archivo
  5.    Archivo->Append( "primera linea" );
  6.    Archivo->Append( "segunda  linea" );
  7.    Archivo->Append( "tercera linea" );
  8.  
  9.    //Guardar le archivo
  10.    Archivo->SaveToFile( "c:\\Carpeta\\Prueba.txt" );
  11.  
  12.    //Para abrir el archivo
  13.    Archivo->LoadFromFile( "c:\\Carpeta\\Prueba.txt" );
  14.  
  15.    //Para leer todo el archivo
  16.    Archivo->Text;   //te lo da como AnsiString todo el contenido del archivo
  17.  
  18.    //Para leer linea a linea
  19.    Archivo->Strings[0];   //Primera linea
  20.    Archivo->Strings[1];   //Segunda llinea
  21.    Archivo->Strings[2];   //Tercera linea
  22.  
  23.    //Liberar memoris
  24.    delete Archivo;
  25.  
  26.  

No se si sea la sintaxis correcta, por que no lo probe :rolleyes:  pero ese seria el codigo mas o menos
La paranoia es una vision mas sutil de la vida

pilarm

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #5 en: Jueves 17 de Agosto de 2006, 04:47 »
0
No se como estas trabajando  :rolleyes: pero lo unico que se me ocurre que pueda ser el problema es el modo de apertura.

deberias tener una funcion agregar y otra para leer, en la de agregar abres con el modo "a" y en el de leer lo abres "r"

Leete bien los modo de apertura, recuerda cerrar los archivos al final de cada funcion

Escribe si te funciona :D  y que error puede ser para ver en q se te puede ayudar
 :huh:

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #6 en: Jueves 17 de Agosto de 2006, 21:09 »
0
Pues miren aqui esta mi codigo para que lo observen y no funciona ... se malogra al momento que tiene que leer el archivo.
Código: Text
  1.  
  2. //EN MI UNIDAD UNI2.H ESTA ESTO
  3. //---------------------------------------------------------------------------
  4. #ifndef Unit2H
  5. #define Unit2H
  6. #include <vcl.h>
  7. #include <stdio.h>
  8. #include <ctype.h>
  9.  
  10. //---------------------------------------------------------------------------
  11. #endif
  12. //---------------------------------------------------------------------------
  13. class ITem{
  14. private:
  15.         String name;
  16.         String descripcion;
  17. public:
  18.         ITem();
  19.         ITem(String n,String d);
  20.         String Getname();
  21.         String GetDescripcion();
  22. };
  23.  
  24. class TNodo{
  25. private:
  26.         ITem info;
  27.         TNodo *sig;
  28. public:
  29.         TNodo(ITem v,TNodo *siguiente=NULL);
  30.         friend class TLista;
  31. };
  32. typedef TNodo *pNodo;
  33. class TLista{
  34. private:
  35.         pNodo L;
  36.        
  37.         String name;
  38.         struct T{
  39.         String a;
  40.         String b;
  41.         };
  42.  
  43. public:
  44.         TLista();
  45.         void insertar(ITem v);
  46.         void mostrar(TListBox *l);
  47.         //archivos
  48.         void leer(TListBox *l);
  49.  
  50. };
  51.  
  52.  
  53. //Y EN MI IMPLEMENTACION ES DECIR EN UNIT2.PP ESTA ESTO
  54.  
  55. #pragma hdrstop
  56. #include "Unit2.h"
  57. #pragma package(smart_init)
  58. //---------------------------------------------------------------------------
  59. ITem::ITem(){
  60. name=""; descripcion="";
  61. }
  62. ITem::ITem(String n,String d){
  63. name=n; descripcion=d;
  64. }
  65. String ITem::Getname(){
  66. return name;
  67. }
  68. String ITem::GetDescripcion(){
  69. return descripcion;
  70. }
  71. //---------------------------------------------------------------------------
  72. TNodo::TNodo(ITem v,TNodo *siguiente){
  73. info=v;
  74. sig=siguiente;
  75. }
  76. //---------------------------------------------------------------------------
  77. TLista::TLista(){
  78. L=NULL;
  79. name="";
  80. }
  81.  
  82. void TLista::insertar(ITem v){
  83. T copia;
  84. FILE *archivo;
  85. pNodo nuevo=new TNodo(v);
  86. nuevo->sig=L;
  87. L=nuevo;
  88. copia.a=v.Getname();
  89. copia.b=v.GetDescripcion();
  90. archivo=fopen("Solman.txt","a");
  91. fwrite(&copia,sizeof(copia),1,archivo);
  92. fclose(archivo);
  93. }
  94.  
  95. void TLista::mostrar(TListBox *l){
  96. pNodo p;
  97. p=L;
  98. l->Clear();
  99. while(p!=NULL) {
  100. l->Items->Add(p->info.Getname());
  101. p=p->sig;
  102. }
  103. }
  104.  
  105. void TLista::leer(TListBox *l){
  106. T copia;
  107. FILE *archivo;
  108. l->Clear();
  109. archivo=fopen("Solman.txt","rt");
  110. fseek(archivo,0L,SEEK_SET);
  111. fread(&copia,sizeof(copia),1,archivo);
  112. l->Items->Add(copia.a);
  113. fclose(archivo);                   <--- aqui sale error
  114. }
  115.  
  116.  
Y me sale un error en el fclose(archivo)  pero como q despues se arregla y normal
corre pero en el momento que pulso el botom q me muestre el primer registro
de el fichero Solman.txt pues no muestra nada .
Eso es cuando se unsa la funcion   void TLista::leer(TListBox *l) esta funcion
es la que lee el primer registro .
Si alguien sabe pues corriganlo :(

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #7 en: Jueves 17 de Agosto de 2006, 21:31 »
0
Hoye vatoicc como hago para que con

TStringList *Archivo = new TStringList();

pueda ingresar en el archivo un registro y leerlo mmm  :(  como le hago dime para que con eso pueda yo metr tantos registros quiera y los pueda sacar uno poruno ... registro me refiero a una structura o una clase.

Vatoicc

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #8 en: Viernes 18 de Agosto de 2006, 00:23 »
0
Como te lo habia planteado en el codigo, con:

Código: Text
  1.  
  2. TStringList *Archivo = new TStringList();
  3.  
  4.  

solo estas creando un objeto tipo TStringList, que es igual al TString que usa el Memo
para almacenar las lineas, como en el block de notas.

Lo que te plantee, que es lo que yo hago en la mayoria de los casos, es que en tu arhcivo, guardes informacion, o registros, como le quieras llamar, solo que si son numericos, debes tener en cuenta, que TStringList maneja cadenas AnsiString.
Podria ser algo engorroso tener una variable tipo int y tener que usar la funcion IntToStr() para guardarlo en una linea del TStringList, pero para mi, es muy confiable.

No se exactamente que registros quieras guardar, (me da flojera revisar todo el codigo :P ) pero donde dices que te marca el error, recibes como parametro un TListBox, y creo que lo que quieres hacer es poner lo que esta en el arhcivo en el TListBox, si es asi, puedes hacer esto
Código: Text
  1.  
  2. void TLista::leer(TListBox *l)
  3. {
  4.    l->Items->LoadFromFile("Solman.txt");
  5. }
  6.  
  7.  

la parte que no entiendo es la de

T copia;

pero imagino que es una estructura que hiciste
La paranoia es una vision mas sutil de la vida

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #9 en: Viernes 18 de Agosto de 2006, 01:52 »
0
Muchas gracias he jeje si sale .. en cuanto a los registros me refiria a meter una estructura en el archivo
osea
struct a{
string a;
string b;
string con;
}
 a L;
y ahora meter en el archivo L eso es lo q quiero y despues leerlo pero t metodo es bueno tb ;)

eL_MoStRo

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Re: Guardar Registros En C++
« Respuesta #10 en: Viernes 18 de Agosto de 2006, 06:36 »
0
Hola me parece que el problema es que esas funciones fread y fwrite no soportan la clase String ni AnsiString, intenta poner tus atributos de la clase con cadenas char y veras que si funciona.
Espero y te sirva

Código: Text
  1.  
  2. class TItem{
  3. private:
  4. char name[10];
  5. char apellido[10];
  6. }
  7.  
  8.