elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda] Reemplazar String en un archivo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] Reemplazar String en un archivo  (Leído 7,921 veces)
HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: [Ayuda] Reemplazar String en un archivo
« Respuesta #10 en: 4 Mayo 2016, 20:10 pm »

Creo puede funcionar para archivos binarios donde generalmente la cadena_a_reemplazar y el reemplazo son de longitudes iguales

Para un archivo de texto, podrias querer cambiar una palabra corta por una larga (con probabilidad de 50% de que ocurra) y creo tu programa dejaria un hueco con basura... me tocaria revisalor mejor.


En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [Ayuda] Reemplazar String en un archivo
« Respuesta #11 en: 4 Mayo 2016, 20:17 pm »

Creo puede funcionar para archivos binarios donde generalmente la cadena_a_reemplazar y el reemplazo son de longitudes iguales

Para un archivo de texto, podrias querer cambiar una palabra corta por una larga (con probabilidad de 50% de que ocurra) y creo tu programa dejaria un hueco con basura... me tocaria revisalor mejor.

Basura como tal no, pero si se concatenaría la cadena con algun valor adyacente. Y e programa hacia cosas raras, por ejemplo como el registro esta delimitado por Enter y si se borra este se concatenaría con el siguiente registro.

El siguiente codigo genera una base de datos random para prueba

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int main() {
  5. FILE *f;
  6. char *linea;
  7. int i = 0,j;
  8. int len,valor;
  9. int max = 10000000;
  10. time_t inicio, fin;
  11. srand(time(NULL));
  12. f = fopen("bd","w");
  13. printf("Escribiendo archivo por favor espere son %i de registros\n",max);
  14. inicio = time(NULL);
  15. while(i < max) {
  16. len = 40 + rand() % 20;
  17. j = 0;
  18. linea = calloc(len,1);
  19. while(j < len) {
  20. linea[j] = (char) 97 + rand()%26;
  21. j++;
  22. }
  23. valor = rand();
  24. fprintf(f,"%s*%i\n",linea,valor);
  25. free(linea);
  26. i++;
  27. }
  28. fin = time(NULL);
  29. printf("tiempo de escritura %lu\n",fin-inicio);
  30. fclose(f);
  31. }


Tarda 52 segundos en escribir el archivo (En mi sistema) y incluye el tiempo de creacion del texto random, supongo que sera menor si el texto ya esta creado El archivo pesa sobre 500 MB


« Última modificación: 4 Mayo 2016, 20:24 pm por AlbertoBSD » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [Ayuda] Reemplazar String en un archivo
« Respuesta #12 en: 4 Mayo 2016, 20:23 pm »

Es cierto. Se me olvidó mencionarlo. La basura se crearía cuando hay saltos de línea en archivos de texto, pues Windows usa salto de carro y salto de línea, mientras que otros sistemas operativos usan solo el salto de línea
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: [Ayuda] Reemplazar String en un archivo
« Respuesta #13 en: 4 Mayo 2016, 20:29 pm »

Es cierto. Se me olvidó mencionarlo. La basura se crearía cuando hay saltos de línea en archivos de texto, pues Windows usa salto de carro y salto de línea, mientras que otros sistemas operativos usan solo el salto de línea

Lo mio debe funcionar en GNU/Linux

A ver implemente una forma de reescribir todo el archivo, me tome de la liberar de cambiar algunas cosas..

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include<sys/stat.h>
  6.  
  7. char **resultados;
  8. char **lines;
  9. char *nueva_linea;
  10. int *map;
  11.  
  12. int count = 0;
  13.  
  14. char** str_split(char* a_str, const char a_delim){
  15.    char** result    = 0;
  16.    size_t count     = 0;
  17.    char* tmp        = a_str;
  18.    char* last_comma = 0;
  19.    char delim[2];
  20.    delim[0] = a_delim;
  21.    delim[1] = 0;
  22.    while (*tmp)
  23.    {
  24.        if (a_delim == *tmp)
  25.        {
  26.            count++;
  27.            last_comma = tmp;
  28.        }
  29.        tmp++;
  30.    }
  31.    count += last_comma < (a_str + strlen(a_str) - 1);
  32.    count++;
  33.    result = malloc(sizeof(char*) * count);
  34.    if (result)
  35.    {
  36.        size_t idx  = 0;
  37.        char* token = strtok(a_str, delim);
  38.        while (token)
  39.        {
  40.            assert(idx < count);
  41.            *(result + idx++) = strdup(token);
  42.            token = strtok(0, delim);
  43.        }
  44.        assert(idx == count - 1);
  45.        *(result + idx) = 0;
  46.    }
  47.    return result;
  48. }
  49.  
  50. off_t fsize(char *filename) {
  51. struct stat st;
  52. if (stat(filename, &st) == 0)
  53. return st.st_size;
  54. return -1;
  55. }
  56.  
  57. void mostrarProducto(){
  58. int i;
  59. printf("%i coincidencias encontradas...\n\n", count);
  60. for(i = 0; i < count; i++){
  61. printf("%i) %s\n", i+1, resultados[i]);
  62. }
  63. printf("Por favor, seleccione una opcion: ");
  64. }
  65.  
  66. void seleccionarProducto(){
  67. int nuevo_stock,opcion;
  68.  
  69. char** resultado_split;
  70. scanf("%i", &opcion);
  71. printf("%s", resultados[opcion-1]);
  72.  
  73. resultado_split = str_split(resultados[opcion-1], '*');
  74.  
  75. printf("\nEl stock actual del producto es: %s\nPor favor introduzca el nuevo stock:",resultado_split[1]);
  76. scanf("%i", &nuevo_stock);
  77. nueva_linea = calloc(20+strlen(resultado_split[0]),1);
  78. sprintf(nueva_linea,"%s*%i",resultado_split[0],nuevo_stock);
  79. free(resultado_split[2]);
  80. free(resultado_split[1]);
  81. free(resultado_split);
  82. printf("%s", nueva_linea); // ACAA!! nueva_linea es la que debe reemplazar a
  83. free(lines[map[opcion-1]]);
  84. lines[map[opcion-1]] = nueva_linea;
  85. }
  86.  
  87. void buscarProducto(char * codProducto){
  88. FILE * fp;
  89. char *file_buff;
  90.    size_t len = 0;
  91. int i = 0, j = 0;
  92. len = fsize("bd");
  93. file_buff =  calloc(len+1,sizeof(char));
  94. fp = fopen("bd", "r");
  95.    if (fp == NULL)
  96.        exit(EXIT_FAILURE);
  97.  
  98. fread(file_buff,sizeof(char),len,fp);
  99. fclose(fp);
  100. lines = str_split(file_buff,'\n');
  101. memset(file_buff,0,len);
  102. free(file_buff);
  103. while(lines[i] != NULL) {
  104. printf("Examinando linea %i: %s\n",i,lines[i]);
  105. if(strstr(lines[i],codProducto) != NULL) {
  106. printf("Coinciendia %s encontrada en linea %i, copiando apuntador a resultado %i\n",codProducto,i,count);
  107. resultados = realloc(resultados,sizeof(char*)*count+1);
  108. map = realloc(map,sizeof(int)*count+1);
  109. resultados[count] = lines[i];
  110. map[count] = i;
  111. count++;
  112. }
  113. i++;
  114. }
  115. if(count != 0){
  116. mostrarProducto(count);
  117. seleccionarProducto();
  118. }else{
  119. printf("No se ha encontrado el producto!");
  120. }
  121. j = 0;
  122. fp = fopen("bd","w");
  123. while(j < i) {
  124. fprintf(fp,"%s\n",lines[j]);
  125. free(lines[j]);
  126. j++;
  127. }
  128. fclose(fp);
  129.    exit(EXIT_SUCCESS);
  130. }
  131.  
  132.  
  133. int main(){
  134. buscarProducto("h65t");
  135. exit(EXIT_SUCCESS);
  136. }


Falla al momento de reescribir el campo seleccionado, todavía estoy depurando...



Muchísimas gracias  ;-) ;-) ;-)

Ha funcionado a la perfección, no puedo estar más que feliz, de verdad en general y para todos desde el fondo de mi MUCHAS GRACIAS, me agrada ver la disposición y ganas de ayudar, ya saben si tienen alguna duda que esté dentro de mi área, con gusto intentaré ayudar.

Gracias nuevamente  ;-) ;-) ;-)
En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: [Ayuda] Reemplazar String en un archivo
« Respuesta #14 en: 5 Mayo 2016, 21:01 pm »

Aunque ya se solucionó pongo otra alternativa: Mapear el archivo en la memoria.

saludos.
En línea

Un byte a la izquierda.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [Ayuda] Reemplazar String en un archivo
« Respuesta #15 en: 5 Mayo 2016, 21:12 pm »

Aunque ya se solucionó pongo otra alternativa: Mapear el archivo en la memoria.

saludos.

Eso ya se había propuesto, pero pensamos que si el archivo es demasiado grande, había que buscar otra solución
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: [Ayuda] Reemplazar String en un archivo
« Respuesta #16 en: 5 Mayo 2016, 21:15 pm »

Aunque el archivo sea grande se podría trabajar de la misma manera   :laugh:  swap.

En línea

Un byte a la izquierda.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [Ayuda] Reemplazar String en un archivo
« Respuesta #17 en: 5 Mayo 2016, 22:19 pm »

Ahora que me doy cuenta, mi función estaba hecha una pena XDD.

Versión mejorada:
Código
  1. void insertar(FILE * archivo, unsigned int pos, const char *nueva_cadena, unsigned int longitud_cadena) {
  2.    char *buffer = malloc(longitud_cadena);
  3.  
  4.    while(feof(archivo) != 0) {
  5.        fseek(archivo, pos, SEEK_CUR); // Nos movemos por el archivo hasta la posición 'pos'
  6.        fread((void *)buffer, sizeof(char), longitud_cadena, archivo);
  7.        clearerr(archivo); // Por si hemos llegado al final del archivo...
  8.        fseek(archivo, pos, SEEK_CUR);
  9.        fwrite((const void *)nueva_cadena, sizeof(char), longitud_cadena, archivo);
  10.        pos += longitud_cadena;
  11.    }
  12.  
  13.    free(buffer);
  14. }
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[DUda] Reemplazar un archivo por otro en vB
Programación Visual Basic
NsTeam 1 2,087 Último mensaje 10 Diciembre 2009, 20:52 pm
por NsTeam
ayuda con batch, modificar un archivo sin reemplazar lo anterior.
Scripting
kapototal1 2 2,825 Último mensaje 23 Noviembre 2010, 04:17 am
por kapototal1
problemas al intentar reemplazar string en la memoria. « 1 2 »
Programación C/C++
Destro- 11 5,466 Último mensaje 29 Noviembre 2011, 08:59 am
por Eternal Idol
Reemplazar archivo en cache
Hacking
Topixx 0 1,944 Último mensaje 24 Septiembre 2012, 10:34 am
por Topixx
Buscar y reemplazar palabra en archivo
Programación C/C++
fran7385 3 5,005 Último mensaje 28 Enero 2014, 22:47 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines