Domingo 15 de Diciembre de 2024, 20:05
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Error: Infracción De Acceso (0xc0000005)
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Error: Infracción De Acceso (0xc0000005) (Leído 4036 veces)
mpassado
Nuevo Miembro
Mensajes: 8
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.
Tweet
Rataman
Miembro activo
Mensajes: 45
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:
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
Personal
|
LinkedIn
mpassado
Nuevo Miembro
Mensajes: 8
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:
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
Personal
|
LinkedIn
mpassado
Nuevo Miembro
Mensajes: 8
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:
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!!).
Personal
|
LinkedIn
mpassado
Nuevo Miembro
Mensajes: 8
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
////////////////////////////////////////////
//Archivo: archivo.h
////////////////////////////////////////////
#ifndef archivo_h
#define archivo_h
class archivo
{
public:
archivo();
void abrirArchivoLeer(char *);
void abrirArchivoEscribir(char *);
void cerrarArchivo();
int leerNumeroArchivo();
char leerLetraArchivo();
void escribirNumArchivo(const int &);
void escribirCarArchivo(const char &);
private:
FILE *ptrArchivo;
FILE *ptrAuxiliar;
};
#endif
////////////////////////////////////////
// Archivo: archivo.cpp
///////////////////////////////////////
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include "archivo.h"
using namespace std;
//Constructor, inicializa en NULL los punteros
archivo::archivo()
{
ptrArchivo = NULL;
ptrAuxiliar = NULL;
}
//Abre un archivo solo escritura
void archivo::abrirArchivoEscribir(char *nomArchivo)
{
cout << 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);
}
ptrAuxiliar = ptrArchivo;
}
//Las otras funciones que se incluyen en el archivo.h no las copié
// para simplificar.
/////////////////////////////////////////////////////////
//Archivo: usaArchivo.cpp
/////////////////////////////////////////////////////////
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include "archivo.h"
using namespace std;
int main(int argumentos, char *archivos[])
{
archivo *matriz, *comandos, *nuevo;
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();
cin.get();
return 0;
}
Espero haber incluido bien el código,
gracias...
Ruben3d
Miembro HIPER activo
Mensajes: 710
Nacionalidad:
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.
Personal
|
LinkedIn
Ruben3d
Miembro HIPER activo
Mensajes: 710
Nacionalidad:
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
archivo *nuevo = new archivo;
y cuando acabes de usarlo, has de hacer:
Código: Text
delete archivo;
Con estas llamadas se realiza también las llamadas a los constructores y destructores.
Un saludo.
Ruben3d
Personal
|
LinkedIn
mpassado
Nuevo Miembro
Mensajes: 8
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...
mpassado
Nuevo Miembro
Mensajes: 8
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...
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:
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
Personal
|
LinkedIn
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Error: Infracción De Acceso (0xc0000005)