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


 


Tema destacado: Personaliza-Escoge el diseño del foro que más te guste.


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  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 649 veces)
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Codigo c++ , problema.
« en: 27 Enero 2013, 00:39 »

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 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 »

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 »

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

durasno


Desconectado Desconectado

Mensajes: 376


Ver Perfil
Re: Codigo c++ , problema.
« Respuesta #3 en: 27 Enero 2013, 08:57 »

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 »

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 »

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 php
Desarrollo Web
caros 4 605 Último mensaje 28 Agosto 2004, 23:08
por -Riven-Ward-
Problema con codigo
Programación C/C++
mariogl91 2 893 Último mensaje 2 Julio 2005, 02:12
por Gangrel
problema con codigo php
Desarrollo Web
Arcangel 2 518 Último mensaje 9 Agosto 2005, 22:01
por Arcangel
Problema codigo
Programación C/C++
::Neo:: 3 885 Último mensaje 10 Julio 2008, 06:05
por neo007
¿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 8,905 Último mensaje 23 Diciembre 2010, 15:19
por pucheto
Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines