Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: FR-32 en 10 Marzo 2014, 07:08 am



Título: copiar una palabra de un archivo en C
Publicado por: FR-32 en 10 Marzo 2014, 07:08 am
buen dia, necesito ayuda con esto porfavor!!!

.....en un archivo ya creado estan los siguientes datos:

agregar(001,serrucho,100.00,5)
agregar(010,martillo,20.00,10)
agregar(012,escalera,300.00,10)

lo que tengo q hacer es leer linea por linea y copiar a otro archivo unicamente los datos encerrados en los parentesis (), alguna idea q me pudieran dar para hacerlo se los agradeceria mucho.... GRACIAS!!!


Título: Re: copiar una palabra de un archivo en C
Publicado por: engel lex en 10 Marzo 2014, 07:25 am
abre block de notas, pega toda la info haces click en edicion, asllí clickeas reemplazar

en el cuadro colocas
buscar: "agregar("
reemplazar:

(dejas reemplazar en vacio y no coloques las comillas)
presionas "reemplazar todo"

eso se habrá eliminado ese termino (si no tienes más paréntesis libres por ahí)

repites con el ")"

por favor responde si ter sirvió


Título: Re: copiar una palabra de un archivo en C
Publicado por: SrCooper en 10 Marzo 2014, 08:07 am
Puedes recorrer la línea caracter por caracter y cuando llegues a un paréntesis empiezas a copiar a otro archivo y cuando llegues a ')' paras de copiar.

Yo lo que haría sería algo así:

Código
  1. bool hayQueCopiar = false;
  2. for (...){  //recorres el archivo
  3.    if (caracter == '(' ) hayQueCopiar = true;
  4.    if (caracter == ')' ) hayQueCopiar = false;
  5.    if (hayQueCopiar) copia_a_archivo(caracter);
  6. }
  7.  

Un saludo



Título: Re: copiar una palabra de un archivo en C
Publicado por: leosansan en 10 Marzo 2014, 08:47 am

Puedes recorrer la línea caracter por caracter y cuando llegues a un paréntesis empiezas a copiar a otro archivo y cuando llegues a ')' paras de copiar.
.......................................

¿Y por qué no copiarlo todo de golpe?.

Esta es mi salida al ejecutar el código que propongo y lo que justamente escribe en el fichero de salida:

Citar
agregar001,serrucho,100.00,5
agregar010,martillo,20.00,10
agregar012,escalera,300.00,10

Process returned 0 (0x0)   execution time : 1.099 s
Press any key to continue.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NOM_ARCHIVO_IN   "Entrada3.txt"
  6. #define NOM_ARCHIVO_OUT  "Entrada4.txt"
  7. #define NUM_CHARS     256
  8.  
  9. int main(void){
  10.   FILE *entrada,*salida;
  11.   char linea[NUM_CHARS],linea_out[NUM_CHARS];
  12.   char *p;
  13.  
  14.   if ((entrada = fopen(NOM_ARCHIVO_IN, "r")) == NULL){
  15.      perror(NOM_ARCHIVO_IN);
  16.      return EXIT_FAILURE;
  17.   }
  18.  
  19.   if ((salida = fopen(NOM_ARCHIVO_OUT, "w")) == NULL){
  20.      perror(NOM_ARCHIVO_OUT);
  21.      return EXIT_FAILURE;
  22.   }
  23.    while (fgets(linea, NUM_CHARS, entrada) != NULL){
  24.    p = strtok (linea,"()");
  25.    while (p != NULL ) {
  26.      if (strcmp(p,"agregar"))
  27.          strcpy(linea_out,p);
  28.          fprintf(salida,"%s",linea_out);
  29.          printf ("%s",p);
  30.          p = strtok (NULL, "()");
  31.      }
  32.    }
  33.  
  34.    fclose(entrada);
  35.    fclose(salida);
  36.    return EXIT_SUCCESS;
  37. }

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: copiar una palabra de un archivo en C
Publicado por: FR-32 en 11 Marzo 2014, 03:12 am
muchas gracias!!!! por tomarse el tiempo de responder, enserio me ayudarona(y)


Título: Re: copiar una palabra de un archivo en C
Publicado por: rir3760 en 11 Marzo 2014, 04:06 am
Otra opción, una vez se obtenga la linea del archivo, es utilizar la función strchr para encontrar las posiciones de los caracteres '(' y ')'. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void)
  6. {
  7.   char *linea[] = {
  8.      "agregar(001,serrucho,100.00, 5)",
  9.      "agregar(010,martillo, 20.00,10)",
  10.      "agregar(012,escalera,300.00,10)"
  11.   };
  12.   size_t num_lineas = sizeof linea / sizeof linea[0];
  13.   size_t i;
  14.  
  15.   char *p;
  16.   char *q;
  17.  
  18.   for (i = 0; i < num_lineas; i++)
  19.      if ((p = strchr(linea[i], '(')) && (q = strchr(++p, ')')) && q > p)
  20.         printf("%.*s\n", (int) (q - p), p);
  21.  
  22.   return EXIT_SUCCESS;
  23. }

Un saludo


Título: Re: copiar una palabra de un archivo en C
Publicado por: Yoel Alejandro en 12 Marzo 2014, 03:44 am
Bueno, opino que el enfoque de Cooper es el mismo que tomó leosansan, pero el primero más a mano y el segundo formalizado por medio de la función strtok()

La idea de rir creo que no necesita mejoras (como siempre  :D), aunque yo me quiero referir a la propuesta que se basa en la bonita función strtok() cuya finalidad es precisamente analizar léxicamente una expresión.

Pero hay un detallito leosansan, y es que la palabra "agregar" creo que no debe ir. Analicemos el funcionamiento de strtok(): En la primera ejecución debería buscar '(', en cuyo caso extrae de la cadena la frase "agregar", es decir, justo antes del '('. La segunda llamada debería ser con el divisor ')', en cuyo caso toma lo que está después del anterior '(' y antes del siguiente ')'. Ya no se necesitan más llamadas en esa línea del archivo.

Con leves modificaciones, propongo el programa así (el printf ("%s\n",p) es sólo para propósitos de verificar el resultado):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NOM_ARCHIVO_IN   "Entrada3.txt"
  6. #define NOM_ARCHIVO_OUT  "Entrada4.txt"
  7. #define NUM_CHARS     256
  8.  
  9. int main(void) {
  10.  
  11.   FILE *entrada,*salida;
  12.   char linea[NUM_CHARS],linea_out[NUM_CHARS];
  13.   char *p, *q;
  14.  
  15.   if ((entrada = fopen(NOM_ARCHIVO_IN, "r")) == NULL){
  16.   perror(NOM_ARCHIVO_IN);
  17.   return EXIT_FAILURE;
  18.   }
  19.  
  20.   if ((salida = fopen(NOM_ARCHIVO_OUT, "w")) == NULL){
  21.   perror(NOM_ARCHIVO_OUT);
  22.   return EXIT_FAILURE;
  23.   }
  24.   while (fgets(linea, NUM_CHARS, entrada) != NULL) {
  25.  
  26.      if ( ( p = strtok (linea, "(") ) == NULL ) continue;
  27.      if ( ( p = strtok (NULL, ")") ) == NULL ) continue;
  28.      printf ("%s\n", p);
  29.      fprintf(salida,"%s\n", p);
  30.   }
  31.  
  32.   fclose(entrada);
  33.   fclose(salida);
  34.   return EXIT_SUCCESS;
  35. }

cuya salida:

001,serrucho,100.00,5
010,martillo,20.00,10
012,escalera,300.00,10


==========================================
EDITO:

A juzgar por el problema original, pareciera que se tiene un fichero de órdenes que deben ser interpretadas (algo como un script ejecutable). En ese caso podría ser deseable separar los agumentos de la función agregar, a través del token ','. Para lo cual es ideal usar de nuevo la strtok(). Considérese que la primera llamada debe ser con la cadena de argumentos como primer parámetro y las posteriores con NULL, por eso los punteros p y q. Esta versión separa los argumentos con un '\n' (haciendo como una pila de ellos), aunque pudiera usarse un '\t', un espacio, etc:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NOM_ARCHIVO_IN   "Entrada3.txt"
  6. #define NOM_ARCHIVO_OUT  "Entrada4.txt"
  7. #define NUM_CHARS     256
  8.  
  9. int main(void) {
  10.  
  11.   FILE *entrada,*salida;
  12.   char linea[NUM_CHARS],linea_out[NUM_CHARS];
  13.   char *p, *q;
  14.  
  15.   if ((entrada = fopen(NOM_ARCHIVO_IN, "r")) == NULL){
  16.   perror(NOM_ARCHIVO_IN);
  17.   return EXIT_FAILURE;
  18.   }
  19.  
  20.   if ((salida = fopen(NOM_ARCHIVO_OUT, "w")) == NULL){
  21.   perror(NOM_ARCHIVO_OUT);
  22.   return EXIT_FAILURE;
  23.   }
  24.   while (fgets(linea, NUM_CHARS, entrada) != NULL) {
  25.  
  26.      if ( ( p = strtok (linea, "(") ) == NULL ) continue;
  27.      if ( ( p = strtok (NULL, ")") ) == NULL ) continue;
  28.      q = p;
  29.      while ( ( p = strtok (q, ",") ) != NULL ) {
  30.         printf ("%s\n", p);
  31.         fprintf(salida,"%s\n", p);
  32.         q = NULL;
  33.      }
  34.   }
  35.  
  36.   fclose(entrada);
  37.   fclose(salida);
  38.   return EXIT_SUCCESS;
  39. }

con la salida:

001
serrucho
100.00
5
010
martillo
20.00
10
012
escalera
300.00
10


Saludos!!


Título: Re: copiar una palabra de un archivo en C
Publicado por: leosansan en 12 Marzo 2014, 04:21 am
* En el primero de los códigos apoyo la intención pero está mal implementado, sencillamente no furula.

* EL segundo no cumple las expectativas que el autor planteo: leer de un tirón lo que hay entre los paréntesis y tu código  "desparrama" los datos en un fichero. Fíjate lo estricto que soy con las peticiones de los usuarios, no me gusta salirme del guión que ellos marcan porque posiblemente no es eso lo que ellos quieran, aunque a nosotros nos parezca otra cosa.

* Y tercero, siempre aprendiendo cosas nuevas, como en el caso del aporte de rir3760, pero si no, no me gusta perder ni jugando a las chapas. :laugh: :laugh: :laugh:


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)





Título: Re: copiar una palabra de un archivo en C
Publicado por: Yoel Alejandro en 13 Marzo 2014, 01:05 am
Leosansan, cuándo hablas de códigos, ¿te refieres a los míos?

Si es así, por qué dices que el primero no funciona. ¿Lo ejecutaste? Su salida es:

001,serrucho,100.00,5
010,martillo,20.00,10
012,escalera,300.00,10

entonces ¿por qué no funciona?

Ahora, lo que dijo el usuario fue "unicamente los datos encerrados en los parentesis ()", lo cual excluye la palabra "agregar", precisamente por ello presenté el primer código.

El segundo programa que propuse es por lo que inferí de las palabras del autor del tema, aunque reconozco que el no lo pidió exactamente así. Pero bien, él dijo "los datos encerrados entre paréntesis", y al referirse a "los datos" me imagino que es sin las comas. Por eso el segundo programa muestra los datos separados. Pero creo que deberíamos esperar que sea el autor del post quién sentencie al respecto y nos diga cómo era que lo quería  :D


Título: Re: copiar una palabra de un archivo en C
Publicado por: leosansan en 13 Marzo 2014, 06:51 am
Sorry!, creo que equivoqué la respuesta.

++Sorry!.


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: copiar una palabra de un archivo en C
Publicado por: Yoel Alejandro en 13 Marzo 2014, 18:02 pm
Ah ok, no problem!  ;D


Título: Re: copiar una palabra de un archivo en C
Publicado por: FR-32 en 14 Marzo 2014, 05:34 am
gracias enserio por tomarse el tiempo para responder mi post, yoel_alejandro si capto de buena forma lo que pedia,, gracias a todos!!!!