• Lunes 18 de Noviembre de 2024, 05:19

Autor Tema:  Error: Infracción De Acceso (0xc0000005)  (Leído 4011 veces)

mpassado

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Error: Infracción De Acceso (0xc0000005)
« en: Lunes 28 de Junio de 2004, 17:59 »
0
HOLA,

Estoy realizando un práctico (una class) en el que mi programa debe abrir 2 archivos que se pasan como argumentos al main() y generar uno nuevo que guarde los cambios.  El error de acceso a memoria me lo presenta cuando ejecuto el programa (en la compilación no dice nada) y al tratar de abrir el archivo como de solo escritura.  <_<

void archivo::abrirArchivoEscribir(char *nomArchivo)
{
   ptrArchivo = fopen(nomArchivo, "w");
   if(ptrArchivo == NULL)
   {
      printf("Error: el archivo no se puede abrir\n");
      printf("Presione una tecla para continuar...");
      getch();
      exit(1);
   }
}

por favor, quisiera saber cual es el problema. Al programa lo ejecuté en W98, NT4 y me dá el mismo error.
Las funciones que abre los archivos en solo lectura funcionan perfecto, son iguales a la anterior, solo cambia la "w" por la "r".

Agradezco toda ayuda lo antes posible...
Gracias. :hola:

Rataman

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #1 en: Martes 29 de Junio de 2004, 01:19 »
0
Tal vez el fichero k intentas abrir en modo escritura, tenga el parametro de solo lectura del SO y por eso no te permita acceder de ese modo.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #2 en: Martes 29 de Junio de 2004, 11:48 »
0
Supongo que ptrArchivo es un miembro de la clase de tipo FILE*. ¿En qué punto exacto te da el error? ¿En la llamada a fopen? Comprueba que el puntero nomArchivo es válido.

Un saludo.

Ruben3d

mpassado

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #3 en: Martes 29 de Junio de 2004, 12:51 »
0
Gracias por contestar

Respecto a sus consultas, al archivo lo crea, y en las propiedades aparece solo tildada la opción de "Modificado". El ptrArchivo es tipo FILE * y el punto de error estaría en:

ptrArchivo = fopen(nomArchivo, "w");

ya que agregué un cout << nomArchivo;  antes de esta y muestra el nombre correcto.

Otra cosa, el SO es NT4 y en el W98 el error es: provocó un error de página no válida en el módulo de PROYECTOARCHIVO.EXE (este es el nombre del archivo) de 0167:004018a4

Saludos y gracias.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #4 en: Martes 29 de Junio de 2004, 13:58 »
0
Es extraño que suceda eso en esa llamada. ¿Para usar fopen incluyes la cabecera de C, "stdio.h", o la de C++, "cstdio" ?

Un saludo.

Ruben3d

mpassado

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #5 en: Martes 29 de Junio de 2004, 14:36 »
0
Tengo la de stdio.h, e incorporé la cstdio y compila bien igual que antes.

Saludos.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #6 en: Miércoles 30 de Junio de 2004, 20:29 »
0
Pon el código aqui y lo pruebo (pero usa el tag CODE o XCODE!!).

mpassado

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #7 en: Miércoles 30 de Junio de 2004, 22:35 »
0
ahí va, serían tres archivos, como comentario agrego los nombres de cada uno:

Código: Text
  1.  
  2. ////////////////////////////////////////////
  3. //Archivo: archivo.h
  4. ////////////////////////////////////////////
  5. #ifndef archivo_h
  6. #define archivo_h
  7.  
  8. class archivo
  9. {
  10. public:
  11.    archivo();
  12.    void abrirArchivoLeer(char *);
  13.    void abrirArchivoEscribir(char *);
  14.    void cerrarArchivo();
  15.    int leerNumeroArchivo();
  16.    char leerLetraArchivo();
  17.    void escribirNumArchivo(const int &);
  18.    void escribirCarArchivo(const char &);
  19. private:
  20.    FILE *ptrArchivo;
  21.    FILE *ptrAuxiliar;
  22. };
  23.  
  24. #endif
  25.  
  26. ////////////////////////////////////////
  27. // Archivo:  archivo.cpp
  28. ///////////////////////////////////////
  29. #include &#60;conio.h&#62;
  30. #include &#60;stdio.h&#62;
  31. #include &#60;iostream&#62;
  32. #include &#34;archivo.h&#34;
  33. using namespace std;
  34.  
  35. //Constructor, inicializa en NULL los punteros
  36. archivo::archivo()
  37. {
  38.    ptrArchivo = NULL;
  39.    ptrAuxiliar = NULL;
  40. }
  41.  
  42. //Abre un archivo solo escritura
  43. void archivo::abrirArchivoEscribir(char *nomArchivo)
  44. {
  45.    cout &#60;&#60; nomArchivo;
  46.    ptrArchivo = fopen(nomArchivo, &#34;w&#34;);
  47.    if(ptrArchivo == NULL)
  48.    {
  49.       printf(&#34;Error: el archivo no se puede abrir&#092;n&#34;);
  50.       printf(&#34;Presione una tecla para continuar...&#34;);
  51.       getch();
  52.       exit(1);
  53.    }
  54.    ptrAuxiliar = ptrArchivo;
  55. }
  56.  
  57. //Las otras funciones que se incluyen en el archivo.h no las copié
  58. // para simplificar.
  59.  
  60. /////////////////////////////////////////////////////////
  61. //Archivo: usaArchivo.cpp
  62. /////////////////////////////////////////////////////////
  63. #include &#60;stdio.h&#62;
  64. #include &#60;conio.h&#62;
  65. #include &#60;stdlib.h&#62;
  66. #include &#60;iostream&#62;
  67. #include &#34;archivo.h&#34;
  68. using namespace std;
  69.  
  70. int main(int argumentos, char *archivos[])
  71. {
  72.    archivo *matriz, *comandos, *nuevo;
  73.    char *nomMatriz, *nomComandos, *nomNuevos;
  74.  
  75. //Verifica que solo se coloquen 2 argumentos
  76.    if(argumentos &#62; 3)
  77.    {
  78.       printf(&#34;&#092;n&#092;nDemasiados argumentos, coloque solo dos.&#34;);
  79.       printf(&#34;Presione una tecla para terminar...&#34;);
  80.       cin.get();
  81.       exit(1);
  82.    }
  83.    
  84.    nomMatriz = &archivos[1][0];
  85.    cout &#60;&#60; &#34;Nombre matriz: &#34; &#60;&#60; nomMatriz &#60;&#60; &#34;&#092;n&#34;;
  86.    
  87.    nomComandos = &archivos[2][0];
  88.    cout &#60;&#60; &#34;Nombre comandos: &#34; &#60;&#60; nomComandos &#60;&#60; &#34;&#092;n&#34;;
  89.  
  90.    nomNuevos = &#34;nuevo.txt&#34;;
  91.    cout &#60;&#60; &#34;Nombre nuevo: &#34; &#60;&#60; nomNuevos &#60;&#60; &#34;&#092;n&#34;;
  92.    
  93.    nuevo-&#62;abrirArchivoEscribir(nomNuevos); // Esto dá el error!!!
  94.  
  95.    nuevo-&#62;cerrarArchivo();
  96.    matriz-&#62;cerrarArchivo();
  97.    comandos-&#62;cerrarArchivo();
  98.  
  99.    cin.get();
  100.    return 0;
  101. }
  102.  
  103.  

Espero haber incluido bien el código,
gracias...

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #8 en: Miércoles 30 de Junio de 2004, 22:42 »
0
De acuerdo, mañana te lo pruebo.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #9 en: Viernes 2 de Julio de 2004, 17:41 »
0
Hola.

Ya vi tu problema. No es fopen el que da el error, es la asignación de lo que retorna a la variable miembro, a través del '='. Si te fijas, en vez de declarar los objetos declaras punteros a los objetos, y los utilizas sin haber reservado memoria para ellos. Por ello, cuando al método se le pasa el puntero this, que apunta a las variables miembro del objeto, se le pasa un puntero sin inicializar. De esta manera, cuando desde el método intentas escribir en la variable miembro estás incurriendo en una violación de protección de memoria, pues no se ha reservado. ¿Cómo hacer esto? Así:

Código: Text
  1. archivo *nuevo = new archivo;
  2.  

y cuando acabes de usarlo, has de hacer:

Código: Text
  1. delete archivo;
  2.  

Con estas llamadas se realiza también las llamadas a los constructores y destructores.

Un saludo.

Ruben3d

mpassado

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #10 en: Lunes 5 de Julio de 2004, 13:11 »
0
Muchas gracias, realmente fuiste de mucha ayuda.

Saludos y nuevamente gracias...   :hola:

mpassado

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #11 en: Jueves 8 de Julio de 2004, 00:11 »
0
Lamento comunicar que la modificación fue un fracaso...   &lt;_&lt;  y lamento la tardanza de la respuesta.
Igualmente agradezco tu ayuda y si tienes alguna alternativa te lo agradecería.
Al producir la modificación me dice el compilador que "archivo" no es un tipo FILE

Saludos, y gracias.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error: Infracción De Acceso (0xc0000005)
« Respuesta #12 en: Viernes 9 de Julio de 2004, 01:33 »
0
Asombroso, porque yo he realizado la modificación y compila perfectamente. Aqui tienes el archivo:

usaArchivo.cpp
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
/////////////////////////////////////////////////////////
//Archivo: usaArchivo.cpp
/////////////////////////////////////////////////////////
#include <cstdio>
//#include <conio.h>
#include <cstdlib>
#include <iostream>
#include "archivo.h"
using namespace std;

int main(int argumentos, char *archivos[])
{
  archivo    *matriz = new archivo,
              *comandos = new archivo,
             *nuevo = new archivo;

  char *nomMatriz, *nomComandos, *nomNuevos;

//Verifica que solo se coloquen 2 argumentos
  if(argumentos > 3)
  {
     printf("\n\nDemasiados argumentos, coloque solo dos.");
     printf("Presione una tecla para terminar...");
     cin.get();
     exit(1);
  }
  
  nomMatriz = &archivos[1][0];
  cout << "Nombre matriz: " << nomMatriz << "\n";
  
  nomComandos = &archivos[2][0];
  cout << "Nombre comandos: " << nomComandos << "\n";

  nomNuevos = "nuevo.txt";
  cout << "Nombre nuevo: " << nomNuevos << "\n";
  
  nuevo->abrirArchivoEscribir(nomNuevos); // Esto dá el error!!!

  nuevo->cerrarArchivo();
  matriz->cerrarArchivo();
  comandos->cerrarArchivo();
  
  delete nuevo;
  delete comandos;
  delete matriz;

  cin.get();
  return 0;
}<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Un saludo.

Ruben3d