copiar una palabra de un archivo en C

Iniciado por FR-32, 10 Marzo 2014, 07:08 AM

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

FR-32

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!!!

engel lex

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ó
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

SrCooper

#2
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í:


bool hayQueCopiar = false;
for (...){  //recorres el archivo
   if (caracter == '(' ) hayQueCopiar = true;
   if (caracter == ')' ) hayQueCopiar = false;
    if (hayQueCopiar) copia_a_archivo(caracter);
}


Un saludo


leosansan

#3
Cita de: 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.
.......................................

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NOM_ARCHIVO_IN   "Entrada3.txt"
#define NOM_ARCHIVO_OUT  "Entrada4.txt"
#define NUM_CHARS     256

int main(void){
  FILE *entrada,*salida;
  char linea[NUM_CHARS],linea_out[NUM_CHARS];
  char *p;

  if ((entrada = fopen(NOM_ARCHIVO_IN, "r")) == NULL){
     perror(NOM_ARCHIVO_IN);
     return EXIT_FAILURE;
  }
 
  if ((salida = fopen(NOM_ARCHIVO_OUT, "w")) == NULL){
     perror(NOM_ARCHIVO_OUT);
     return EXIT_FAILURE;
  }
   while (fgets(linea, NUM_CHARS, entrada) != NULL){
   p = strtok (linea,"()");
   while (p != NULL ) {
     if (strcmp(p,"agregar"))
         strcpy(linea_out,p);
         fprintf(salida,"%s",linea_out);
         printf ("%s",p);
         p = strtok (NULL, "()");
     }
   }
   
   fclose(entrada);
   fclose(salida);
   return EXIT_SUCCESS;
}


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



FR-32

muchas gracias!!!! por tomarse el tiempo de responder, enserio me ayudarona(y)

rir3760

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:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
   char *linea[] = {
      "agregar(001,serrucho,100.00, 5)",
      "agregar(010,martillo, 20.00,10)",
      "agregar(012,escalera,300.00,10)"
   };
   size_t num_lineas = sizeof linea / sizeof linea[0];
   size_t i;
   
   char *p;
   char *q;
   
   for (i = 0; i < num_lineas; i++)
      if ((p = strchr(linea[i], '(')) && (q = strchr(++p, ')')) && q > p)
         printf("%.*s\n", (int) (q - p), p);
   
   return EXIT_SUCCESS;
}


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

Yoel Alejandro

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NOM_ARCHIVO_IN   "Entrada3.txt"
#define NOM_ARCHIVO_OUT  "Entrada4.txt"
#define NUM_CHARS     256

int main(void) {
   
   FILE *entrada,*salida;
   char linea[NUM_CHARS],linea_out[NUM_CHARS];
   char *p, *q;

   if ((entrada = fopen(NOM_ARCHIVO_IN, "r")) == NULL){
   perror(NOM_ARCHIVO_IN);
   return EXIT_FAILURE;
   }

   if ((salida = fopen(NOM_ARCHIVO_OUT, "w")) == NULL){
   perror(NOM_ARCHIVO_OUT);
   return EXIT_FAILURE;
   }
   while (fgets(linea, NUM_CHARS, entrada) != NULL) {
     
      if ( ( p = strtok (linea, "(") ) == NULL ) continue;
      if ( ( p = strtok (NULL, ")") ) == NULL ) continue;
      printf ("%s\n", p);
      fprintf(salida,"%s\n", p);
   }

   fclose(entrada);
   fclose(salida);
   return EXIT_SUCCESS;
}


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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NOM_ARCHIVO_IN   "Entrada3.txt"
#define NOM_ARCHIVO_OUT  "Entrada4.txt"
#define NUM_CHARS     256

int main(void) {
   
   FILE *entrada,*salida;
   char linea[NUM_CHARS],linea_out[NUM_CHARS];
   char *p, *q;

   if ((entrada = fopen(NOM_ARCHIVO_IN, "r")) == NULL){
   perror(NOM_ARCHIVO_IN);
   return EXIT_FAILURE;
   }

   if ((salida = fopen(NOM_ARCHIVO_OUT, "w")) == NULL){
   perror(NOM_ARCHIVO_OUT);
   return EXIT_FAILURE;
   }
   while (fgets(linea, NUM_CHARS, entrada) != NULL) {
     
      if ( ( p = strtok (linea, "(") ) == NULL ) continue;
      if ( ( p = strtok (NULL, ")") ) == NULL ) continue;
      q = p;
      while ( ( p = strtok (q, ",") ) != NULL ) {
         printf ("%s\n", p);
         fprintf(salida,"%s\n", p);
         q = NULL;
      }
   }

   fclose(entrada);
   fclose(salida);
   return EXIT_SUCCESS;
}


con la salida:

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


Saludos!!
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

#7
* 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! ..... !!!!






Yoel Alejandro

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
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

#9
Sorry!, creo que equivoqué la respuesta.

++Sorry!.


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