Codigo c++ , problema.

Iniciado por ThePinkPanther, 27 Enero 2013, 00:39 AM

0 Miembros y 1 Visitante están viendo este tema.

ThePinkPanther

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

amchacon

No uses malloc. En C++ tienes los operadores new[] y delete[] para eso:

Código (cpp) [Seleccionar]
a = new char[BLOQUEDETEXTO];

Y para leer desde un fichero tienes la clase ifstream:

Código (cpp) [Seleccionar]
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:

Código (cpp) [Seleccionar]
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í:

Código (cpp) [Seleccionar]
#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;

}
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

Muy bueno . Pero entonces ,¿ no tiene solución en C ?

durasno

CitarPorque 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
Ahorrate una pregunta, lee el man

amchacon

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: ");
       scanf("%s",Nombre);
       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);
   printf("%s",Lectura);

   fclose(Archivo);
   system("PAUSE");
   return 0;
}


Siempre que puedas, intenta no usar realloc en exceso. Te arriesgas a muchos fallos de memoria.
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

Muchas gracias me sirvio :D !