Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: digimikeh en 4 Marzo 2019, 19:42 pm



Título: Infracción de acceso al leer la ubicación...
Publicado por: digimikeh en 4 Marzo 2019, 19:42 pm
Buenas.

Estoy intentando guardar y leer de/a un archivo en forma binaria, no tengo problemas guardando, el problema va leyendo el archivo:


Código
  1.  
  2. Ifstream fromFile;
  3. fromFile.open("Archivo.bin", iOS::binary);
  4.  
  5. if (fromFile.good()){
  6.  
  7.     UnaClase uc;
  8.  
  9.     fromFile.read((char*)&uc, sizeof(UnaClase));
  10.  
  11.     //La siguiente linea me da el error:
  12.     std::cout << uc.LeerNumero() << std::endl;
  13.  
  14.  
  15. }
  16.  

Pareciera que no se está escribiendo la información en la memoria que le corresponde a la variable "uc".

Que podrá ser=?

gracias.


Título: Re: Infracción de acceso al leer la ubicación...
Publicado por: Loretz en 4 Marzo 2019, 20:21 pm
Hola; ¿por qué no pones un ejemplo completo pero mínimo que se pueda compilar? Así creo que va a ser más fácil.


Título: Re: Infracción de acceso al leer la ubicación...
Publicado por: ivancea96 en 4 Marzo 2019, 20:31 pm
Buenas.

Estoy intentando guardar y leer de/a un archivo en forma binaria, no tengo problemas guardando, el problema va leyendo el archivo:


Código
  1.  
  2. Ifstream fromFile;
  3. fromFile.open("Archivo.bin", iOS::binary);
  4.  
  5. if (fromFile.good()){
  6.  
  7.     UnaClase uc;
  8.  
  9.     fromFile.read((char*)&uc, sizeof(UnaClase));
  10.  
  11.     //La siguiente linea me da el error:
  12.     std::cout << uc.LeerNumero() << std::endl;
  13.  
  14.  
  15. }
  16.  

Pareciera que no se está escribiendo la información en la memoria que le corresponde a la variable "uc".

Que podrá ser=?

gracias.

Si bien se puede leer directamente en una estructura en C++ igual que en C, hay que tener cuidado de no tener campos que sean clases dentro, y que no haya punteros tampoco.
¿Qué tiene "UnaClase"? Si tuviera por ejemplo una string, podría ser un problema.


Título: Re: Infracción de acceso al leer la ubicación...
Publicado por: digimikeh en 4 Marzo 2019, 22:52 pm
Ya entiendo!, el ejemplo que puse aquí funciona, pensé que el problema estaba en la forma en que llamaba al archivo binario lectura y escritura, y en realidad el problema estaba en que dentro de UnaClase, tengo una variable tipo char * nombre, que me estaba dando el problema, es decir, para lectura y escritura binaria me tengo que olvidar de usar punteros.... es asi? .,..  simplemente reemplace :

Código
  1. char * nombre;
  2.  

por

Código
  1. char nombre[16];
  2.  

y funciono...
curioso.. pero por que sucede esto?, acaso el compilador se confunde cuando copio memoria de un puntero?

En otras palabras, si deseo copiar información en forma binaria a un archivo y leerlo también en forma binaria, la fuente no puede ser memoria dinámica.

Gracias a ambos por las respuestas


Título: Re: Infracción de acceso al leer la ubicación...
Publicado por: Loretz en 4 Marzo 2019, 23:55 pm
Citar
curioso.. pero por que sucede esto?, acaso el compilador se confunde cuando copio memoria de un puntero?
No, el compilador hace lo que le dices.

Código:
char * nombre;
es un puntero a char, una variable que puede guardar una dirección de memoria. Dependiendo de la plataforma; su tamaño suele ser de 32 bits o de 64 bits.

Código:
char nombre[16];
es un array de caracteres de estilo C; puede guardar una sucesión de caracteres, muchas veces con un cero al final; su tamaño es siempre de 16 Bytes (128 bits).

No es lo mismo guardar en un archivo una dirección de memoria que guardar una sucesión de caracteres. En el primer caso podrías estar guardando algo como  2127788540 y en el segundo algo como  castellanamente.



Título: Re: Infracción de acceso al leer la ubicación...
Publicado por: digimikeh en 5 Marzo 2019, 01:05 am
Ok, pero el primer caso me daba error, no podía si quiera mostrar la dirección de memoria..


Título: Re: Infracción de acceso al leer la ubicación...
Publicado por: ivancea96 en 5 Marzo 2019, 12:32 pm
Ok, pero el primer caso me daba error, no podía si quiera mostrar la dirección de memoria..

Pongamos un caso. Desde un programa escribes esa estrucutra y se escribe la direccion del char*.
Desde otro programa, lees esa dirección en la estructura. Esa dirección casi seguro que no pertenece a tu programa, es una dirección de memoria a la que tu programa no tiene acceso. Intentar leerla, en muchos casos, dará un error.