Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: TonietFB en 16 Noviembre 2014, 22:53 pm



Título: Programa para copiar una palabra
Publicado por: TonietFB en 16 Noviembre 2014, 22:53 pm
Hola a todos! Mirar tengo un problemilla. Tengo el código siguiente, que funciona perfectamente, que lo que hace es copiar un archivo .txt en otro nuevo, letra por letra.

La cosa es que yo quiero que me copie solo una palabra, localizada en un punto. ¿Como puedo hacerlo? Llevo días probando y nada. Soy un poco novatillo en esto, y agradecería mucho algo de ayuda.

Mi archivo .txt es algo así

[1]
10442021
8483689
[2]
be7      Cosmico              8.39e-002      1.22e-002     2.09e-002    10 
bi212    SerieTh232Rn220      1.32e+002      2.54e-001     4.16e-001    14 
[3]
be7      10   464.4   467.4   477.6     7.6    461   525    26.5     12352.0 Cosmico             
bi212    14   732.2   735.2   730.4     9.6    696   769    25.3    887251.3 SerieTh232Rn220     
[4]
 1   119.9   122.9   122.9     2.2    114   133     8.9     90248.9
 2   147.7   150.7   150.5     2.9    136   158     8.4    121760.3
 3   176.3   179.3   179.0     3.1    161   185     8.6    202054.9
 8   305.3   308.3   307.0     5.4    282   327    10.6    218150.5
 9   404.4   407.4   418.6    15.5    375   459    38.5    308035.7
16   875.6   878.6   875.1     8.9    842   893    19.7     35045.8
[5]

Y yo quiero que me saque de esta linia "bi212    SerieTh232Rn220      1.32e+002      2.54e-001     4.16e-001    14" el primer número, es decir que en el fichero de salida aparezca "1.32e+002"

Gracias de antemano!

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*copy_file recibe como parametro el nombre del fichero origen y el nombre del fichero destino
  4. donde se copiara, devuelve 1 si se copio exitosamente,0 en caso contario*/
  5. int copy_file(char* f_org,char* f_dest);
  6. int main()
  7. {
  8. if(!copy_file("fichero1.txt","fichero2.txt"))
  9.                printf("El fichero no se pudo copiar\n");
  10. else
  11.        printf("Fichero copiado exitosamente\n");
  12.  
  13. return 0;
  14. }
  15. int copy_file(char* f_org,char* f_dest)
  16. {
  17. FILE *fp_org,*fp_dest;
  18. char c;
  19.  
  20. if(!(fp_org=fopen(f_org,"rt")) || !(fp_dest=fopen(f_dest,"wt")))
  21. {
  22. perror("Error de apertura de ficheros");
  23. exit(EXIT_FAILURE);
  24. }
  25.  
  26. while((c=fgetc(fp_org))!=EOF && !ferror(fp_org) && !ferror(fp_dest))
  27. fputc(c,fp_dest);
  28.  
  29. if(ferror(fp_org) || ferror(fp_org))
  30. return 1;
  31.  
  32. fclose(fp_org);
  33. fclose(fp_dest);
  34. return 0;
  35. }
  36.  


Título: Re: Programa para copiar una palabra
Publicado por: patilanz en 16 Noviembre 2014, 23:02 pm
Puedes hacer una especie de contador variable que cuente los \n encontrados para las nuevas lineas, necesitas 4 después obtienes la linea y lo divides según los espacios.
Para dividir utiliza strtok()

http://www.cplusplus.com/reference/cstring/strtok/
http://codigomaldito.blogspot.com.es/2005/11/dividir-en-tokens-o-palabras-con.html

Saludos


Título: Re: Programa para copiar una palabra
Publicado por: rir3760 en 17 Noviembre 2014, 02:20 am
Y yo quiero que me saque de esta linia "bi212    SerieTh232Rn220      1.32e+002      2.54e-001     4.16e-001    14" el primer número, es decir que en el fichero de salida aparezca "1.32e+002"
¿Buscas la primera linea que inicia literalmente con "bi212    SerieTh232Rn220" y extraer el numero de punto flotante a continuación de esta? Si es así puedes utilizar la función fgets para leer el archivo linea por linea junto con sscanf para verificar si esta cumple con el formato esperado.

Si no es así entonces por favor indica a detalle cual es la estructura del archivo de entrada.

Un saludo


Título: Re: Programa para copiar una palabra
Publicado por: TonietFB en 17 Noviembre 2014, 07:39 am
Si, eso mismo busco. Pero no estan separados por un solo espacio cada una de las palabras.


Título: Re: Programa para copiar una palabra
Publicado por: rir3760 en 17 Noviembre 2014, 17:28 pm
Como ya te comente debes leer el archivo linea por linea (mediante fgets) verificando (mediante sscanf) si esta cumple con el formato buscado, si eso sucede terminas el bucle de inmediato. Mas o menos así:
Código
  1. FILE *in;
  2. char linea[MAX_CHARS];
  3. double num;
  4.  
  5. /* ... */
  6.  
  7. while (fgets(linea, MAX_CHARS, in) != NULL)
  8.   if (sscanf(linea, " bi212    SerieTh232Rn220 %lf", &num) == 1)
  9.      break;
  10.  
  11. if (feof(in)){
  12.   /* Fin de archivo ==> No se encontro la linea */
  13. }else if (ferror(in)){
  14.   /* Error en la lectura del archivo */
  15. }else {
  16.   printf("%e\n", num);
  17. }
  18.  
  19. /* ... */

Un saludo