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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Codigo c++ , problema.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Codigo c++ , problema.  (Leído 3,286 veces)
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Codigo c++ , problema.
« 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.?


« Última modificación: 27 Enero 2013, 00:42 am por Puredepapas » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Codigo c++ , problema.
« Respuesta #1 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. }


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Codigo c++ , problema.
« Respuesta #2 en: 27 Enero 2013, 02:25 am »

Muy bueno . Pero entonces ,¿ no tiene solución en C ?
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Codigo c++ , problema.
« Respuesta #3 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
En línea

Ahorrate una pregunta, lee el man
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Codigo c++ , problema.
« Respuesta #4 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.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Codigo c++ , problema.
« Respuesta #5 en: 27 Enero 2013, 18:17 pm »

Muchas gracias me sirvio :D !
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con código
Programación Visual Basic
z3r0 Bug 7 2,168 Último mensaje 24 Noviembre 2005, 16:51 pm
por NYlOn
¿Cuál es la diferencia entre código objeto, código máquina y código binario?
Programación General
Aikanáro Anário 9 28,770 Último mensaje 23 Diciembre 2010, 15:19 pm
por pucheto
Extrayendo código fuente de una web (Problema con código generado por JS)
PHP
Littl3 4 7,726 Último mensaje 3 Marzo 2011, 04:13 am
por Nakp
[C] Problema GNUPlot con código C
Programación C/C++
valen7valverde 0 2,288 Último mensaje 8 Mayo 2020, 04:31 am
por valen7valverde
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines