Programación General > C/C++
Buscar string en un archivo, y obtener datos
m0skit0:
strcpy te sirve perfectamente, aunque yo siempre uso strncpy para evitar infernales bugs de desbordamientos de buffer (que además pueden comprometer la seguridad de tu programa).
--- Código: C ---unsigned int pos; // Suponemos que aquí tienes guardada la posición en que se encuentra la subcadenachar* buscar; // Aquí la subcadena que buscaschar* cadena; // Aquí la cadena completachar* resto; // Aquí es donde quieres almacenar el resto de la cadena// Recuerda reservar la memoria y liberarla para todos estos punteros ;)[...]char* aux = (char*) ((unsigned int)cadena + pos + strlen(buscar));strncpy(resto, aux, <tamaño de "resto">); Ojo que tienes que reservar suficiente memoria para que en resto pueda caber todo lo que venga después de la subcadena.
emma1990:
Al final lo fui haciendo sin strcpy(). Qué te parece esto? A lo mejor es un poco chapuzas pero para lo que quiero es funcional :P
--- Código: C ---FILE *pf;char cadena[100], linea[100], *ptr;pf = fopen("file.txt", "r");while (fgets(linea,100,pf) != NULL) { fscanf(pf, "%s", &cadena); ptr=strstr(linea, "Ki");if (ptr!=0) printf("%c%c%c%c%cn", cadena[ptr-cadena+6], cadena[ptr-cadena+7], cadena[ptr-cadena+8], cadena[ptr-cadena+9], cadena[ptr-cadena+10]); }fclose(pf);getchar();}
m0skit0:
Un poco no, es MUY chapuzas. ¿Y qué pasa si la línea tiene más de 5 caracteres después del marcador? ¿Y por qué empiezas en +6?
De todas formas, si lo que quieres es mostrar el resto de la cadena, te vale con
--- Código: C ---if (ptr != NULL) { printf("%sn", (char*)((unsigned int)ptr + strlen("Ki")));} - No pongas las condiciones del if seguidas, es poco legible, y usa siempre { }, te ahorrarás futuros quebraderos de cabeza.
- Usa NULL, no 0 (tampoco hagas !ptr)
- No uses literales en el código, usa constantes (#define)
Además ese código es muy poco flexible. Intenta programar de manera que si te toca modificar el código (y créeme que lo vas a tener que modificar) no tengas que mover cielo y tierra.
Amilius:
De acuerdo con todo, especialmente con adoptar un estilo definido de programación.
Aunque personalmente prefiero este tipo de comparaciones para verificar punteros no nulos:
--- Código: C++ --- if (ptr){}
Y para los nulos prefiero usar el 0, ¿Para que escribir 4 letras y ocultar lo que en realidad es un puntero nulo?
--- Código: C++ --- if (0 == ptr){}
Tampoco me hago problema con un if en una sóla linea siempre y cuando sea más rápido de leer. En casos extremadamente simples es más rápido leer esto:
--- Código: C++ --- if (0 == ptr) return;
que esto:
--- Código: C++ --- if (0 == ptr) { return;}
haddad:
mmm creo que quede un poco confundida en cuanto al orden de soluciones que planteaste
--- Cita de: "m0skit0" --- printf("%sn", (char*)((unsigned int)ptr + strlen("Ki")));
--- Fin de la cita ---
eso es la solucion a?
--- Cita de: "m0skit0" ---- No pongas las condiciones del if seguidas, es poco legible, y usa siempre { }, te ahorrarás futuros quebraderos de cabeza.
- Usa NULL, no 0 (tampoco hagas !ptr)
- No uses literales en el código, usa constantes (#define)
--- Fin de la cita ---
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa