Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Alojar archivo a memoria

Estas en el tema de Alojar archivo a memoria en el foro de C/C++ en Foros del Web. Hola, ¿Como están? Tengo el siguiente problema: Yo, he querido leer el contenido de un archivo en memoria y subirlo en memoria para trabajar más ...
  #1 (permalink)  
Antiguo 16/04/2014, 18:24
 
Fecha de Ingreso: diciembre-2013
Mensajes: 150
Antigüedad: 10 años, 4 meses
Puntos: 8
Alojar archivo a memoria

Hola, ¿Como están? Tengo el siguiente problema: Yo, he querido leer el contenido de un archivo en memoria y subirlo en memoria para trabajar más fácilmente con él. La función que hace eso, ya la tengo hecha.

Pero resulta, que al generar dinamicamente la memoria necesaria para almacenar cada byte del archivo, y asignarsela al puntero, ocurre algo inusual: No es posible acceder al contenido guardado en el puntero fuera de la función.

Para que por favor puedan solucionar mi problema, les dejo mi codigo fuente:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3. #include <stdio.h>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. int load_file_in_memory(char *buffer, char path[]);
  9.  
  10. int main(){
  11.     char *buffer;
  12.     char path[] = "C:\\codigo.txt";
  13.  
  14.     load_file_in_memory(buffer, path);
  15.  
  16.     cout << "Accediendo al puntero desde fuera de la funcion: " << endl;
  17.     cout << buffer << endl;
  18. }
  19.  
  20. int load_file_in_memory(char *buffer, char path[]){
  21. /*************************************************************
  22.     CARGA ARCHIVO EN MEMORIA.
  23. *************************************************************/
  24.  
  25.  
  26.     unsigned int size_of_file;
  27.  
  28.     std::ifstream file;
  29.     file.open(path, ios::binary);
  30.  
  31.     ///Siempre verifica que el archivo haya abierto correctamente
  32.     if(file.bad()){
  33.         cout << "Lo siento. Fallo el archivo!!" << endl;
  34.         return -1;
  35.     }
  36.  
  37.     ///Se posiciona en el ultimo byte para obtener tamaño.
  38.     file.seekg(0, ios::end); ///Se va a la úlitma posicion
  39.     size_of_file = file.tellg(); ///Obtiene cual es dicha posicion, es decir la longitud de archivo
  40.     file.seekg(0, ios::beg); ///Va al principio el puntero.
  41.  
  42.  
  43.     buffer = new char[size_of_file];
  44.  
  45.     file.read(buffer, size_of_file);
  46.  
  47.     file.close();
  48.  
  49.     cout << "Mirando el contenido del puntero dentro de la funcion" << endl;
  50.     cout << buffer << endl;
  51.  
  52.  
  53. /*************************************************************
  54.     FIN DE CARGA EN MEMORIA
  55. **************************************************************/
  56.  
  57.  
  58. }

Para que puedan probar el codigo, deberían crear un fichero de prueba, con algún texto. Así podrán observar lo que digo.

Gracias de antemano.
__________________
¿Necesitas ayuda con algún algoritmo? Si tienes dudas, entonces visita: http://algoritmosypseudocodigo.blogspot.com/.
  #2 (permalink)  
Antiguo 16/04/2014, 18:48
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: Alojar archivo a memoria

hola jhonny6721.
bueno mira yo no programo mucho en c++ pero lo unico que hise fue pasar la bariable buffer como global y creo otra simplemente le asigne el balor de buffer y se imprimio correctamente y pues se volvio a imprimir el valor del archivo nose si es esto lo que queria pruebalo.
Código C++:
Ver original
  1. #include <iostream>
  2.     #include <fstream>
  3.     #include <stdio.h>
  4.      
  5.      
  6.     using namespace std;
  7.     char *buffer, *dos;
  8.     int load_file_in_memory(char *buffer, char path[]);
  9.      
  10.     int main(){
  11.        
  12.         char path[] = "C:\\codigo.txt";
  13.      
  14.         load_file_in_memory(buffer, path);
  15.      
  16.         cout << "Accediendo al puntero desde fuera de la funcion: " << endl;
  17.         cout << dos << endl;
  18.     }
  19.      
  20.     int load_file_in_memory(char *buffer, char path[]){
  21.     /*************************************************************
  22.         CARGA ARCHIVO EN MEMORIA.
  23.     *************************************************************/
  24.      
  25.      
  26.         unsigned int size_of_file;
  27.      
  28.         std::ifstream file;
  29.         file.open(path, ios::binary);
  30.      
  31.         ///Siempre verifica que el archivo haya abierto correctamente
  32.         if(file.bad()){
  33.             cout << "Lo siento. Fallo el archivo!!" << endl;
  34.             return -1;
  35.         }
  36.      
  37.         ///Se posiciona en el ultimo byte para obtener tamaño.
  38.         file.seekg(0, ios::end); ///Se va a la úlitma posicion
  39.         size_of_file = file.tellg(); ///Obtiene cual es dicha posicion, es decir la longitud de archivo
  40.         file.seekg(0, ios::beg); ///Va al principio el puntero.
  41.      
  42.      
  43.         buffer = new char[size_of_file];
  44.      
  45.         file.read(buffer, size_of_file);
  46.         dos = buffer;
  47.         file.close();
  48.      
  49.         cout << "Mirando el contenido del puntero dentro de la funcion" << endl;
  50.         cout << buffer << endl;
  51.      
  52.      
  53.     /*************************************************************
  54.         FIN DE CARGA EN MEMORIA
  55.     **************************************************************/
  56.      
  57.      
  58.     }

bueno amigo espero haber ayudado.
saludo drewermerc.
  #3 (permalink)  
Antiguo 16/04/2014, 18:57
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Alojar archivo a memoria

En general, las funciones NO PUEDEN modificar lo que reciben como parametro.

Existe la solucion de pasar un puntero para modificar LO APUNTADO, no el puntero. No es lo que quieres. Quieres modificar el puntero.

Soluciones alternativas a usar la variable global?
- retornar el puntero. Usar el retorno para asignarselo al puntero.
- usar un puntero a un puntero.
__________________
Visita mi perfil en LinkedIn
  #4 (permalink)  
Antiguo 17/04/2014, 11:18
 
Fecha de Ingreso: diciembre-2013
Mensajes: 150
Antigüedad: 10 años, 4 meses
Puntos: 8
Respuesta: Alojar archivo a memoria

Gracias. Drewermerc y Calgary Corpus por ayudarme. Ya lo pude solucionar, usando las sugerencias que me dieron. Yo opté por colocar ese codigo en una clase, y almacenar las variables dentro de la misma clase como privadas.

Siento que me hace falta aprender más sobre punteros. XD. Si conocieran algun buen manual sobre punteros en C++ en particular, estaría muy agradecido.
__________________
¿Necesitas ayuda con algún algoritmo? Si tienes dudas, entonces visita: http://algoritmosypseudocodigo.blogspot.com/.
  #5 (permalink)  
Antiguo 17/04/2014, 21:38
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: Alojar archivo a memoria

hola jhonny6721.
bueno pues ami las paguina que me han ayudado mucho son estas dos y bueno pues espero que te puedan ayudar tambien.
http://c.conclase.net/curso/?cap=012
http://es.wikibooks.org/wiki/Program...n_C++/Punteros

saludos.
  #6 (permalink)  
Antiguo 17/04/2014, 22:08
 
Fecha de Ingreso: diciembre-2013
Mensajes: 150
Antigüedad: 10 años, 4 meses
Puntos: 8
Respuesta: Alojar archivo a memoria

Gracias, los veré.
__________________
¿Necesitas ayuda con algún algoritmo? Si tienes dudas, entonces visita: http://algoritmosypseudocodigo.blogspot.com/.

Etiquetas: alojar, funcion, int, memoria
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:23.