Registros ASCII con valores binarios en el medio

Iniciado por Xedrox, 13 Octubre 2012, 07:49 AM

0 Miembros y 1 Visitante están viendo este tema.

Xedrox

Buenas gente,

   Les hago una consulta, estoy tratando de generar un archivo binario que tiene masomenos la siguiente estructura por cada registro

242 caracteres ascci 8 numeros (long long cada uno) 273 caracteres ascci e insertar un salto de linea.



#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

/* Defino la estructura*/
struct tipoRegistro
{
   char pri[242];
   long long num1;
   long long num2;
   long long num3;
   long long num4;
   long long num5;
   long long num6;
   long long num7;
   long long num8;
   char ter[273];
};

int main()
{


   tipoRegistro tran;
   
 
   ofstream fsalida("TEMP", ios::out | ios::binary);
   

   
   
   strcpy(tran.pri,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
   
 
   
   tran.num1=0;
   tran.num2=0;
   tran.num3=0;
   tran.num4=0;
   tran.num5=0;
   tran.num6=0;
   tran.num7=0;
   tran.num8=0;
   
   
 
   
   strcpy(tran.ter,"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
   


   cout << sizeof(tipoRegistro) << endl;
   
   fsalida.write(reinterpret_cast<char *>(&tran), sizeof(tipoRegistro));
   fsalida.close();

   return 0;
}





Los porblemas son los siguientes

1) Como puedo poner el salto de linea? Siempre me sale todo seguido, y necesito el salto de linea porque asi lo va leer otra aplicacion. Asi como esta ahora genera un registro a continuacion del otro, y con '\n' no funciona.

2) Cuando abro el archivo con notepad, veo caracteres binarios al final del registro :S, no se de donde salen.

Muchas Gracias!
Saludos!

do-while

¡Buenas!

Para lo que quieres hacer tendras que usar archivos de texto, no binarios.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Xedrox

No, necesitos grabar los importes en binarios, no en ASCII.

do-while

#3
Cita de: Xedrox en 13 Octubre 2012, 07:49 AM
1) Como puedo poner el salto de linea? Siempre me sale todo seguido, y necesito el salto de linea porque asi lo va leer otra aplicacion. Asi como esta ahora genera un registro a continuacion del otro, y con '\n' no funciona.

Si dentro de la cadena del struct pones un salto de linea y abres el fichero con un editor de texto, el salto de linea estara ahi.

Si quieres insertar un salto de linea despues de cada registro, tendras que usar evidentemente un caracter cuyo valor sea un salto de linea, y escribirlo en el fichero convirtiendolo a una cadena.

De todas todas tiene que funcionar.

Cita de: Xedrox en 13 Octubre 2012, 07:49 AM
2) Cuando abro el archivo con notepad, veo caracteres binarios al final del registro :S, no se de donde salen.

Como estas utilizando un fichero binario, escribes todo el bloque de memoria del struct, de ahi salen los datos que no quieres que salgan, de las posiciones no inicalizadas del vector de caracteres.

Mas informacion, tambien se añadiran (posiblemente) bytes intermedios y al final segun la alineacion entre campos que maneje tu compilador.

Y te sigo diciendo lo mismo, si quieres ver la informacion "bonita" con tu editor de texto, tendras que dar salida con formato (modo texto) a los datos, sino, si manejas bloques de memoria porque te hace falta utilizar ficheros binarios, no pretendas que la informacion quede "bonita".

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Xedrox

Podrias aplicar las correcciones que dices a mi codigo? No quiero la informacion bonita, lo necesito asi porque es un archivo que lee otra aplicacion.

do-while

No hay nada que corregir. Lo unico que tienes que hacer es leer los registros con la segunda aplicacion. Eso si, asegurate de compilar tambien el programa que lee el fichero con el mismo compilador que el que lo crea, asi te aseguras de que los tamaños de los datos y la alineacion de los campos del struct sean los mismos.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Xedrox

No tengo acceso a los fuentes de la otra aplicacion, y me rechaza el archivo por los problemas que enuncio en el primer mensaje.

Empezemos de vuelta, supongamos que necesito crear un archivo con una palabra ASCII al principio, seguido por dos numero en formato long long y por ultimo una palabra ASCCI y el salto de linea. Como podria corregir mi programa?

do-while

¿Añadiendo un caracter como miembro del struct e inicalizandolo con un salto de linea?

¿Escribiendo en el archivo un caracter salto de linea despues de escribir el struct?

De todas formas, asgurate de que si vas a leer o escribir en un fichero que maneja otro programa, lo hagas con datos del mismo tamaño.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Xedrox

Por favor podrias modificar mi programa anterior con algun ejemplo sencillo para hacer como lo enuncias? Ahora no tengo acceso a mi PC pero si me pasas el ejemplo cuando lo tenga podre probarlo y no fallar 100 veces como hasta ahora  :-X. El ejemplo sencillo seria como el mensaje anterior mio.

Desde ya muchas gracias!

Xedrox