Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

No veo el error al crear archivo binario

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: No veo el error al crear archivo binario Responder citando

Buenas

Quiero conseguir grabar en un archivo binario una serie de datos...creo el tipo dato correspondiente y le asigno valores de la forma......

Código:
   struct Dat
    {
      AnsiString Nombre;
      short  valores[50];
    };

   typedef Dat TDat;

   TDat Datos[40];

   ////////////////////////////////

  Datos[0].Nombre = "esto es una prueba";
  Datos[0].valores[0] = 1;
  Datos[0].valores[1] = 2;
  Datos[0].valores[2] = 3;
  Datos[0].valores[3] = 4;
  ...................................


Para grabarlos en Disco utilizo el Agoritmo

Código:
  AnsiString NomArch;
  NomArch ="Archivo.prq";

  struct ffblk ffblk; //Estructura
  ofstream ArchTemp;

  //Path de la Aplicacion
  AnsiString pathApp = ExtractFilePath(Application->ExeName);
  //Path de los Ficheros
  AnsiString pathFich = pathApp+"Dat\\";
  //Asignamos el nombre del Archivo
  AnsiString NomArchTemp =  (pathFich + NomArch);
  //Abro el Archivo para Guardar
  ArchTemp.open(NomArchTemp.c_str(),ios::out|ios::binary);

  TDat LosDatos = Datos[0];
  ArchTemp.write((char *)(&LosDatos),sizeof(LosDatos));
  //Cierro el Archivo
  ArchTemp.close();

Para leer el Archivo utilizo

Código:
  AnsiString NomArch;
  NomArch ="Archivo.prq";

  struct ffblk ffblk; //Estructura

  //Path de la Aplicacion
  AnsiString pathApp = ExtractFilePath(Application->ExeName);
  //Path de los Ficheros
  AnsiString pathFich = pathApp+"Dat\\";
  //Asignamos el nombre del Archivo
  AnsiString NomArchTemp =  (pathFich + NomArch);
  //Abro el Archivo para Leer
  ifstream ArchT(NomArchTemp.c_str(),ios::in|ios::binary);
  TDat LosDatos;
  ArchT.read((char *)(&LosDatos),sizeof(LosDatos));   
  AnsiString NomA = LosDatos.Nombre;
   //Cierro el Archivo
   ArchT.close();


El error que surge cuando al leer el archivo el campo LosDatos.Nombre (NomA) no se corresponde con el valor presuntamente guardado, en cambio el vector Valores si contiene los datos guardados...

Alguna idea... Gracias

Felices fiestas
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Creo que he dado con la solucion...

En el Tipo dato que creo el campo Nombre en vez de declararlo del tipo AnsiString lo declaro vector de char de la forma

Código:
   struct Dat
    {
      [b]char Nombre[18][/b];
      short  valores[50];
    };

   typedef Dat TDat;

   TDat Datos[40]


No se realmente por que con el campo de tipo AnsiString no funciona supongo que tiene que ver con la cantidad de memoria que se le asigna al guardarlo en un archivo binario....

Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

neg1414 escribió:

No se realmente por que con el campo de tipo AnsiString no funciona....


No funciona porque AnsiString no es un dato simple sino una clase con un buffer de longitud variable. Puedes crear un método write en tu estructura que guarde la longitud del AnsiString Nombre y luego Nombre.c_str() para terminar guardando el array de short.

Si Nombre siempre tiene longitud 18 es mas sencillo como lo has hecho.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

A ver si esto te ayuda

AnsiString carpeta_app = ExtractFilePath(Application->ExeName);
AnsiString nombre;
int handle;
int tamano;

tamano = 1024; // Por ejemplo 1024 bytes
unsigned char *datos=new unsigned char [tamano];

// Leer
nombre = carpeta_app + "Archivo.bin";

if (FileExists(nombre))
{
char *read_filename = nombre.c_str();
handle = open(read_filename, O_RDONLY | O_BINARY, S_IREAD);
read(handle,datos,tamano);
close(handle);
}

// Escribir
nombre = carpeta_app + "Archivo.bin";
char *write_filename = nombre.c_str();
tamano = 1024; // Por ejemplo 1024 bytes
handle = open(write_filename,O_CREAT|O_TRUNC|O_BINARY|O_RDWR,S_IREAD|S_IWRITE);

// lógicamente datos, ha de contenerlos
write(handle,datos,tamano);
close(handle);
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.