Programa para copiar una palabra

Iniciado por TonietFB, 16 Noviembre 2014, 22:53 PM

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

TonietFB

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 (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
/*copy_file recibe como parametro el nombre del fichero origen y el nombre del fichero destino
donde se copiara, devuelve 1 si se copio exitosamente,0 en caso contario*/
int copy_file(char* f_org,char* f_dest);
int main()
{
if(!copy_file("fichero1.txt","fichero2.txt"))
                printf("El fichero no se pudo copiar\n");
else
        printf("Fichero copiado exitosamente\n");

return 0;
}
int copy_file(char* f_org,char* f_dest)
{
FILE *fp_org,*fp_dest;
char c;

if(!(fp_org=fopen(f_org,"rt")) || !(fp_dest=fopen(f_dest,"wt")))
{
perror("Error de apertura de ficheros");
exit(EXIT_FAILURE);
}

while((c=fgetc(fp_org))!=EOF && !ferror(fp_org) && !ferror(fp_dest))
fputc(c,fp_dest);

if(ferror(fp_org) || ferror(fp_org))
return 1;

fclose(fp_org);
fclose(fp_dest);
return 0;
}

patilanz

#1
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

rir3760

Cita de: TonietFB en 16 Noviembre 2014, 22:53 PMY 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

TonietFB

Si, eso mismo busco. Pero no estan separados por un solo espacio cada una de las palabras.

rir3760

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í:
FILE *in;
char linea[MAX_CHARS];
double num;

/* ... */

while (fgets(linea, MAX_CHARS, in) != NULL)
   if (sscanf(linea, " bi212    SerieTh232Rn220 %lf", &num) == 1)
      break;

if (feof(in)){
   /* Fin de archivo ==> No se encontro la linea */
}else if (ferror(in)){
   /* Error en la lectura del archivo */
}else {
   printf("%e\n", num);
}

/* ... */


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language