| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Lun 26 Dic, 2011 6:53 pm Asunto: No veo el error al crear archivo binario |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Lun 26 Dic, 2011 7:19 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 26 Dic, 2011 10:42 pm Asunto: |
|
|
| 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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Mar 27 Dic, 2011 9:47 pm Asunto: |
|
|
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 |
|
 |
|