Autor
|
Tema: copiar una palabra de un archivo en C (Leído 5,089 veces)
|
FR-32
Desconectado
Mensajes: 3
|
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!!!
|
|
|
En línea
|
|
|
|
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ó
|
|
|
En línea
|
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
Desconectado
Mensajes: 137
Bazinga!
|
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
|
|
« Última modificación: 10 Marzo 2014, 15:57 pm por SrCooper »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:
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.
#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! ..... !!!!
|
|
« Última modificación: 10 Marzo 2014, 14:26 pm por leosansan »
|
En línea
|
|
|
|
FR-32
Desconectado
Mensajes: 3
|
muchas gracias!!!! por tomarse el tiempo de responder, enserio me ayudarona(y)
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
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
|
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 ), 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): #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: #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!!
|
|
« Última modificación: 12 Marzo 2014, 03:56 am por yoel_alejandro »
|
En línea
|
Saludos, Yoel. P.D..- Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
|
|
« Última modificación: 13 Marzo 2014, 06:53 am por leosansan »
|
En línea
|
|
|
|
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
|
|
|
En línea
|
Saludos, Yoel. P.D..- Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Sorry!, creo que equivoqué la respuesta.
++Sorry!.¡¡¡¡ Saluditos! ..... !!!!
|
|
« Última modificación: 13 Marzo 2014, 06:54 am por leosansan »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Buscar palabra dentro de un archivo
« 1 2 »
Programación C/C++
|
Riki_89D
|
10
|
13,985
|
11 Agosto 2010, 21:28 pm
por Riki_89D
|
|
|
como buscar palabra en un archivo de txt
Programación C/C++
|
AprendizPRG
|
1
|
12,222
|
17 Junio 2012, 14:54 pm
por 0xDani
|
|
|
Quitar una palabra de un nombre de archivo con bat
Mensajería
|
Roble44
|
1
|
4,648
|
18 Diciembre 2013, 23:10 pm
por Stakewinner00
|
|
|
Buscar y reemplazar palabra en archivo
Programación C/C++
|
fran7385
|
3
|
5,034
|
28 Enero 2014, 22:47 pm
por ivancea96
|
|
|
Programa para copiar una palabra
Programación C/C++
|
TonietFB
|
4
|
2,578
|
17 Noviembre 2014, 17:28 pm
por rir3760
|
|