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!!!
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ó
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
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.
#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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
muchas gracias!!!! por tomarse el tiempo de responder, enserio me ayudarona(y)
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
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):
#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!!
* 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)
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
Sorry!, creo que equivoqué la respuesta.
++Sorry!.¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Ah ok, no problem! ;D
gracias enserio por tomarse el tiempo para responder mi post, yoel_alejandro si capto de buena forma lo que pedia,, gracias a todos!!!!