Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ThePinkPanther en 27 Enero 2013, 00:39 am



Título: Codigo c++ , problema.
Publicado por: ThePinkPanther en 27 Enero 2013, 00:39 am
Este programa funciona perfectamente, pero con archivos menores a 1kb , estoy usando asignación dinamica de memoria , con la función realloc .


Código:

#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.?


Título: Re: Codigo c++ , problema.
Publicado por: amchacon en 27 Enero 2013, 01:35 am
No uses malloc. En C++ tienes los operadores new[] y delete[] para eso:

Código
  1. a = new char[BLOQUEDETEXTO];

Y para leer desde un fichero tienes la clase ifstream:

Código
  1. ifstream Lectura;
  2. Lectura.open(n,ios::binary);
  3. Lectura.read(t,TamanyoArchivo);
  4. Lectura.close();

Eso si, para poder usarlo necesitaras saber el tamanyo del archivo. Y para ello hay un truquillo bastante elemental:

Código
  1. ifstream Lectura;
  2. Lectura.open(n);
  3. Lectura.seekg(0,ios::end); // Nos vamos al final del archivo
  4. 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 */
  5. Lectura.seekg(0,ios::beg); // Volvemos al principio
  6.  
  7. t = new char[Tamanyo]; // Creamos la memoria dinamica
  8. Lectura.read(t,TamanyoTexto); // Leemos el texto
  9. Lectura.close(); // Cerramos el archivo

Adaptando tu codigo a las librerias de C++ nos quedaría así:

Código
  1. #include <iostream>
  2. #include <fstream> // Para la clase ifstream
  3. #include <stdlib.h>
  4.  
  5. const int BLOQUEDETEXTO = 200 /* Los parametros constantes deben inicializarse con const y no con un define */
  6.  
  7. using namespace std;
  8.  
  9. int main() {
  10. ifstream archivo;
  11. char *t,*a; // t = texto seleccionado(200 bytes) , a = asignacion dinamica
  12. int numerodetextos=0,textoseleccionado=0;
  13. char n[255]; // nombre del archivo
  14.  
  15. //-------------------------------------------------------------
  16. do
  17. {
  18.  
  19.      cout<<"nombre del archivo: " ; cin>>n;
  20. Archivo.open(n,ios::binary);
  21.  if (!archivo)
  22.  {
  23.  
  24.             cout<<"Nombre incorrecto";
  25.         cout<<endl;
  26.     }      
  27. }
  28. while(!archivo);
  29.  
  30. archivo.seekg(0,ios::end); // Nos vamos al final del archivo
  31. 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
  32. archivo.seekg(0,ios::beg); // Volvemos al principio
  33.  
  34. a = new char[Tamanyo]; // Creamos la memoria dinamica
  35. archivo.read(a,TamanyoTexto); // Leemos el texto
  36. Lectura.close(); // Cerramos el archivo
  37.  
  38. printf("\n %s",a);
  39.  
  40. delete[] a; // borramos la memoria dinámica usada
  41.  
  42. system("pause>nul");
  43.  
  44. return 0;
  45.  
  46. }


Título: Re: Codigo c++ , problema.
Publicado por: ThePinkPanther en 27 Enero 2013, 02:25 am
Muy bueno . Pero entonces ,¿ no tiene solución en C ?


Título: Re: Codigo c++ , problema.
Publicado por: durasno en 27 Enero 2013, 08:57 am
Citar
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


Título: Re: Codigo c++ , problema.
Publicado por: amchacon en 27 Enero 2013, 11:23 am
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:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    FILE* Archivo;
  7.    char* Lectura;
  8.    char Nombre[255];
  9.    int Tamanyo;
  10.  
  11.    do
  12.    {
  13.        printf("Introduce el nombre del archivo: ");
  14.        scanf("%s",Nombre);
  15.        Archivo = fopen(Nombre,"rb");
  16.    }while(Archivo == NULL);
  17.  
  18.    Tamanyo = fseek(Archivo, 0L, SEEK_END );
  19.    Tamanyo = ftell(Archivo);
  20.    fseek(Archivo, 0L, SEEK_SET );
  21.  
  22.    Lectura =(char *)malloc(Tamanyo);
  23.  
  24.    fread(Lectura,sizeof(char),Tamanyo,Archivo);
  25.    printf("%s",Lectura);
  26.  
  27.    fclose(Archivo);
  28.    system("PAUSE");
  29.    return 0;
  30. }

Siempre que puedas, intenta no usar realloc en exceso. Te arriesgas a muchos fallos de memoria.


Título: Re: Codigo c++ , problema.
Publicado por: ThePinkPanther en 27 Enero 2013, 18:17 pm
Muchas gracias me sirvio :D !