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!
#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;
}
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
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
Si, eso mismo busco. Pero no estan separados por un solo espacio cada una de las palabras.
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