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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Infracción de acceso al leer la ubicación...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Infracción de acceso al leer la ubicación...  (Leído 2,740 veces)
digimikeh

Desconectado Desconectado

Mensajes: 184


Ver Perfil
Infracción de acceso al leer la ubicación...
« 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.


En línea

Dungeons & dragons;
dragons.Attack();
Loretz

Desconectado Desconectado

Mensajes: 112


Ver Perfil
Re: Infracción de acceso al leer la ubicación...
« Respuesta #1 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.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.413


ASMático


Ver Perfil WWW
Re: Infracción de acceso al leer la ubicación...
« Respuesta #2 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.
En línea

digimikeh

Desconectado Desconectado

Mensajes: 184


Ver Perfil
Re: Infracción de acceso al leer la ubicación...
« Respuesta #3 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
« Última modificación: 4 Marzo 2019, 23:33 pm por digimikeh » En línea

Dungeons & dragons;
dragons.Attack();
Loretz

Desconectado Desconectado

Mensajes: 112


Ver Perfil
Re: Infracción de acceso al leer la ubicación...
« Respuesta #4 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.

En línea

digimikeh

Desconectado Desconectado

Mensajes: 184


Ver Perfil
Re: Infracción de acceso al leer la ubicación...
« Respuesta #5 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..
En línea

Dungeons & dragons;
dragons.Attack();
ivancea96


Desconectado Desconectado

Mensajes: 3.413


ASMático


Ver Perfil WWW
Re: Infracción de acceso al leer la ubicación...
« Respuesta #6 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines