Autor
|
Tema: Codigo c++ , problema. (Leído 3,748 veces)
|
ThePinkPanther
Desconectado
Mensajes: 82
|
Este programa funciona perfectamente, pero con archivos menores a 1kb , estoy usando asignación dinamica de memoria , con la función realloc . #include <iostream> #include <stdlib.h> #include <stdio.h> #define BLOQUEDETEXTO 200 using namespace std;
int main() { FILE *archivo; char *t,*a; // t = texto seleccionado(200 bytes) , a = asignacion dinamica int numerodetextos=0,textoseleccionado=0; char n[255]; // nombre del archivo
//------------------------------------------------------------- do { cout<<"nombre del archivo: " ; cin>>n; archivo=fopen(n,"rwt"); if(archivo==NULL) {
cout<<"Nombre incorrecto"; cout<<endl; } } while(archivo==NULL); a=(char *)malloc(BLOQUEDETEXTO);
while(! feof(archivo)) {
memset(a+(BLOQUEDETEXTO * numerodetextos),0,BLOQUEDETEXTO); fread(a+(BLOQUEDETEXTO * numerodetextos),1,200,archivo); numerodetextos++;
realloc(a,(BLOQUEDETEXTO * (numerodetextos + 1)));
//dentro de este bucle esta el error.
} printf("\n %s",a); free(a); system("pause>nul"); return 0; }
Porque funciona con archivos de menos de un kb pero cuando trato de leer uno más grande el programa se cuelga.?
|
|
« Última modificación: 27 Enero 2013, 00:42 am por Puredepapas »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
No uses malloc. En C++ tienes los operadores new[] y delete[] para eso: a = new char[BLOQUEDETEXTO];
Y para leer desde un fichero tienes la clase ifstream: ifstream Lectura; Lectura.open(n,ios::binary); Lectura.read(t,TamanyoArchivo); Lectura.close();
Eso si, para poder usarlo necesitaras saber el tamanyo del archivo. Y para ello hay un truquillo bastante elemental: ifstream Lectura; Lectura.open(n); Lectura.seekg(0,ios::end); // Nos vamos al final del archivo int Tamanyo = Lectura.tellg(); /* Le pedimos que nos diga en que posicion del archivo esta y lo guardamos en una variable, ya tenemos el tamanyo del archivo */ Lectura.seekg(0,ios::beg); // Volvemos al principio t = new char[Tamanyo]; // Creamos la memoria dinamica Lectura.read(t,TamanyoTexto); // Leemos el texto Lectura.close(); // Cerramos el archivo
Adaptando tu codigo a las librerias de C++ nos quedaría así: #include <iostream> #include <fstream> // Para la clase ifstream #include <stdlib.h> const int BLOQUEDETEXTO = 200 /* Los parametros constantes deben inicializarse con const y no con un define */ using namespace std; int main() { ifstream archivo; char *t,*a; // t = texto seleccionado(200 bytes) , a = asignacion dinamica int numerodetextos=0,textoseleccionado=0; char n[255]; // nombre del archivo //------------------------------------------------------------- do { cout<<"nombre del archivo: " ; cin>>n; Archivo.open(n,ios::binary); if (!archivo) { cout<<"Nombre incorrecto"; cout<<endl; } } while(!archivo); archivo.seekg(0,ios::end); // Nos vamos al final del archivo int Tamanyo = archivo.tellg(); // Le pedimos que nos diga en que posicion del archivo esta y lo guardamos en una variable, ya tenemos el tamanyo del archivo archivo.seekg(0,ios::beg); // Volvemos al principio a = new char[Tamanyo]; // Creamos la memoria dinamica archivo.read(a,TamanyoTexto); // Leemos el texto Lectura.close(); // Cerramos el archivo printf("\n %s",a); delete[] a; // borramos la memoria dinámica usada system("pause>nul"); return 0; }
|
|
|
En línea
|
|
|
|
ThePinkPanther
Desconectado
Mensajes: 82
|
Muy bueno . Pero entonces ,¿ no tiene solución en C ?
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Porque funciona con archivos de menos de un kb pero cuando trato de leer uno más grande el programa se cuelga.? que raro el problema, lo probe sobre windows con devc++ y tambien se me cuelga el programa(hasta con 500bytes de tamaño se me cuelga). Pero luego lei el archivo de un solo bloque(por ejemplo un bloque de 3000) y si funciona... Espero q alguien aclare esto Saludos PD: compile, el mismo programa, en linux y funciona perfectamente
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Si lo quieres hacer en C, entonces no uses el cout ni "using namespace std". Eso de ir a medias tintas no es muy correcto. Este sería su equivalente en C: #include <stdio.h> #include <stdlib.h> int main() { FILE* Archivo; char* Lectura; char Nombre[255]; int Tamanyo; do { printf("Introduce el nombre del archivo: "); Archivo = fopen(Nombre ,"rb"); }while(Archivo == NULL); Tamanyo = fseek(Archivo , 0L, SEEK_END ); Tamanyo = ftell(Archivo ); fseek(Archivo , 0L, SEEK_SET ); Lectura =(char *)malloc(Tamanyo ); fread(Lectura ,sizeof(char),Tamanyo ,Archivo ); return 0; }
Siempre que puedas, intenta no usar realloc en exceso. Te arriesgas a muchos fallos de memoria.
|
|
|
En línea
|
|
|
|
ThePinkPanther
Desconectado
Mensajes: 82
|
Muchas gracias me sirvio  !
|
|
|
En línea
|
|
|
|
|
|