• Miércoles 1 de Mayo de 2024, 02:44

Autor Tema:  Leer De Un Fichero Para Grabar En Otro  (Leído 1831 veces)

okap

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Leer De Un Fichero Para Grabar En Otro
« en: Miércoles 31 de Enero de 2007, 09:10 »
0
Hola:
Tengo un programa de diseño de etiquetas el cual una vez que tengo diseñada la etiqueta me genera un archivo de texto con el juego de instrucciones que le envia a la impresora. Dicho archivo yo lo tengo que tratar para introducirle una instrucción que el pograma de deseño no contempla y por eso se la tengo que introducir yo.
El problema es que anteriormente utilizaba otro programa el cual me generaba dicho fichero poniendo una instrucción por línea, pero el nuevo pone 2 o más instrucciones en una misma línea. Necesito leer dicho fichero y guardalo en otro poniendo cada instrucción en una sóla línea.

Este es un ejemplo del fichero que generaba el primer programa de diseño de etiquetas:

#!A1
#BON
#IMS54.0/25.0
#DC
#N9
#ERN0
#T6.2
#J3.9
#M1/1
#YN101/1/40///**031#G
#T12.1
#J6.4
#M1/1
#YN101/0/181///**019#G

Este es el código que genera el nuevo programa:

#!A1#BON
#IMSR54.02/24.98
#DC#N9
#ERN0
#T16.26 #J13.55
#YIR43/ÿ
@ þ(     þ'     þ&     þ%     þ$           þ#
  þ"           þ!       þ              þ¬
  þ              þ        þ              þ  
  þ              þ        þ                  þ      
  þ            þ          þ          þ      ¬ þ      þ      ! þ@ þ      " þ@ þ      $ þ    ) þ#G

Siendo la última línea la instrucción referente a una imagen que he introducido y la cual me da problemas al leer del fichero original y grabarla en uno nuevo, donde separo cada instrucción en una línea. Sólo me coge los diez primeros caracteres.

Este es mi problema. Lo que he hecho es abrir el fichero original y el de destino mediante la clase TstringList, pero al leer cada línea como cadena, no consigo grabar en el fichero destino dicha instrucción tal cual está en el original.

Otra de las cosas que he intentado es esta:

  FILE *forigen;
  FILE *fdestino;

  forigen = fopen(rutaFicheroInAux.c_str(),"r");
  fdestino = fopen("c:\destino.txt","w");

  char caracter = ' ';
  char caract_aux = ' ';

  while(!feof(forigen))
  {
    fscanf(forigen,"%c",&caracter);

    if(caracter == '#')
    {
      caract_aux = '\n';
      fprintf(fdestino,"%c",&caract_aux);
      caract_aux = '\r';
      fprintf(fdestino,"%c",&caract_aux);
      fprintf(fdestino,"%c",&caracter);
    }
    else
      fprintf(fdestino,"%c",&caracter);
  }//fin del while

  fclose(forigen);
  fclose(fdestino);

Pero no me graba en el fichero destino caracteres ‘B’ y ‘C’, todos en una misma línea. Pensaba que leyendo el fichero origen carácter a carácter y grabandolo de la misma manera en el fichero destino tendría éxito, pero no ha sido así.

Por favor me gustaría que me mostraseis otra opción para conseguir mi objetivo.

Muchas gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer De Un Fichero Para Grabar En Otro
« Respuesta #1 en: Miércoles 31 de Enero de 2007, 09:27 »
0
No se si entendi muy bien lo que queres pero si lo hice esta es mi respuesta:

¿No es mas facil leer todo el primer archivo en un buffer y escribirlo tal cual en el segundo archivo? Despues tranquilamente se le agregan los datos nuevos.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

okap

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Leer De Un Fichero Para Grabar En Otro
« Respuesta #2 en: Miércoles 31 de Enero de 2007, 09:55 »
0
No exactamente. Lo que quiero es leer el fichero origen caracter a caracter y grabarlo en el fichero destino caracter a caracter. Lo quiero así para que a la vez que voy leyendo del fichero de origen, saber cuando tengo que meter un '\n\r', para que me ponga la nueva instrucción en una sóla línea.
Para aclarar todo esto diré que cada instrucción viene precedida por el caracter '#', y lo que necesito es que sólo haya una instrucción por línea tal que así:

#!A1
#BON
#IMSR54.02/24.98
#DC
#N9
#ERN0
#T16.26
#J13.55
#YIR43/ÿ
@ þ(     þ'     þ&     þ%     þ$           þ#
  þ"           þ!       þ              þ¬
  þ              þ        þ              þ  
  þ              þ        þ                  þ      
  þ            þ          þ          þ      ¬ þ      þ      ! þ@ þ      " þ@ þ      $ þ    ) þ#G

Pero el problema lo tengo al procesar esta última instrucción ya que se trata de una imagen y tiene todos esos caracteres "extraños" que no puedo leer, con lo cual el fichero destino no me quedaría igual que el origen.

Gracias.

okap

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Leer De Un Fichero Para Grabar En Otro
« Respuesta #3 en: Miércoles 31 de Enero de 2007, 10:11 »
0
Me gustaría aclarar lo siguiente. Desconozco si tengo que abrir el fichero origen en modo ascii o en modo binario, pero si lo abro en modo binario no sé si podré leer carácter a carácter para diferenciar cuando leo un ‘#’ para poder así bajar de línea en el fichero destino.
Además necesito abrir el fichero origen y luego grabar el fichero destino con el mismo nombre y en el mismo directorio, pero no sé como cargar el fichero origen en memoria o buffer para poder leer de ahí y a la vez escribir en el fichero destino.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer De Un Fichero Para Grabar En Otro
« Respuesta #4 en: Miércoles 31 de Enero de 2007, 11:26 »
0
No llego a entenderlo realmente ...

¿El primero archivo tiene todo en una sola linea? Lo que mostras no es asi ...

Decis que es #INS#INS#INS pero mostras para el primer archivo:
#INS
#INS
#INS

Si tenes que insertar separadores de linea igualmente podes leer el archivo en un buffer e ir recorriendolo (binario siempre funciona).

Teniendo el archivo en un buffer es tan simple como:

Código: Text
  1.  
  2. char *orgPtr = buffer;
  3. for (long x = 0; x < orgSize; x++, orgPtr++)
  4. {
  5.   if (*orgPtr == '#') { fwrite("\r\n", 2, 1, dstF); }
  6.   fwrite(orgPtr, 1, 1, dstF);
  7. }
  8.  
  9.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

okap

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Leer De Un Fichero Para Grabar En Otro
« Respuesta #5 en: Miércoles 31 de Enero de 2007, 12:21 »
0
Muchas gracias por todo voy a probar si me funciona.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer De Un Fichero Para Grabar En Otro
« Respuesta #6 en: Miércoles 31 de Enero de 2007, 12:49 »
0
De nada pero ... ¿Entonces era asi? ¿El primer archivo tenia todo en una sola linea?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

okap

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Leer De Un Fichero Para Grabar En Otro
« Respuesta #7 en: Miércoles 31 de Enero de 2007, 13:18 »
0
No exactamente, verás el primer archivo es así:

#!A1#DC
#IMSR54.02/24.98
#HV50
#ERN0
#T16.26 #J13.55
#YIR43/ÿ@ þ( þ' þ& þ%    þ$ þ#  þ" þ! þ  þ þ þ    þ þ þ þ þ þ  þ þ þ þ þ  þ! þ@ þ" þ@ þ   $ þ) þ#G
#T01.44 #J19.64 #YN100/0/42///Texto de prueba#G

Y de la forma que necesito que quede es la siguiente:

#!A1
#DC
#IMSR54.02/24.98
#HV50
#ERN0
#T16.26
#J13.55
#YIR43/ÿ@ þ( þ' þ& þ%    þ$ þ#  þ" þ! þ  þ þ þ    þ þ þ þ þ þ  þ þ þ þ þ  þ! þ@ þ" þ@ þ   $ þ) þ#G
#T01.44
#J19.64
#YN100/0/42///Texto de prueba#G

Podrás observar que en el segundo archivo cada instrucción que empieza por # queda en una linea.
El problema está en que no consigo al crear el segundo fichero que la instrucción que ves con simbolos raros se me copie. Por eso me he planteado lo de leerlo en binario.
La idea es dejar el segundo fichero tal cual está el primero pero con la única diferencia de que necesito que cada instrucción que empieza por # quede en una única línea. Por cierto no hagas caso a #G, que verás al final de cada línea ya que eso no me interesa, solo si me encuentro con # seguido de cualquier cosa que no sea una G.

El problema es que con el tema de copiar ficheros al buffer y tratar ficheros en general, sobre todo en modo binario no estoy muy puesto. Te agradecía mucho, si te es posible, que me aclarases un poco la manera de afrontarlo.

Muchas gracias por todo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer De Un Fichero Para Grabar En Otro
« Respuesta #8 en: Miércoles 31 de Enero de 2007, 14:58 »
0
Yo suelo usar la API de Windows pero igual te paso el codigo del ejemplo que hice para probar el codigo que te pase (uso binario que es lo logico):

Código: Text
  1.  
  2. FILE *orgF = fopen("Orig.txt", "rb");
  3. if (orgF)
  4. {
  5.     fseek(orgF, 0, SEEK_END); //vamos hasta el final del archivo
  6.     long orgSize = ftell(orgF);  //obtenemos posicion y por ende tamaño
  7.     rewind(orgF); //volvemos al comienzo
  8.     char *buffer = (char*)malloc(orgSize);
  9.     fread(buffer, orgSize, 1, orgF); //llenamos el buffer con el archivo
  10.     char *orgPtr = buffer; //ya podemos procesar el texto
  11.  
  12.  

Obviamente supongo que son archivos de texto cortos ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

okap

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Leer De Un Fichero Para Grabar En Otro
« Respuesta #9 en: Jueves 1 de Febrero de 2007, 12:52 »
0
Muchas gracias. Me ha funcionado perfectamente para lo que quería.
Me ha sido de gran ayuda.
Un saludo.