Dev - C++ - Error en la lectura de archivos binarios

   
Vista:

Error en la lectura de archivos binarios

Publicado por nDante (2 intervenciones) el 30/08/2014 12:29:09
He escrito el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# include <iostream>
# include <string>
# include <fstream>
# include <math.h>
# include <ctime>
# include <dirent.h>
 
using namespace std;
 
 
const bool TRUE=1;
const bool FALSE=0;
struct PRUEBA
{
    PRUEBA ();
 
    string a;
    unsigned short int b;
    float c;
};
 
PRUEBA::PRUEBA ()
{
    a = "";
    b = 0;
    c = 0;
}
 
 
int main ()
{
 
    PRUEBA entrada, salida;
    string nombre_archivo = "prueba.pru";
 
 
    cout <<  "Entrada antes ->\t" <<  entrada.a << "\n";
    cout <<  "Salida antes ->\t" <<  salida.a << "\n";
 
    entrada.a = "pepe";
    entrada.b = 5;
    entrada.c = 2.3;
 
    ofstream efichero(  nombre_archivo.c_str (), ios::out | ios::binary);
    efichero.write ( reinterpret_cast <char *> ( &entrada ), sizeof ( PRUEBA ));
    efichero.close ();
 
    cout <<  "Entrada medio ->\t" <<  entrada.a << "\n";
    cout <<  "Salida medio ->\t" <<  salida.a << "\n";
 
    ifstream sfichero(  nombre_archivo.c_str (), ios::in | ios::binary);
    sfichero.read ( reinterpret_cast <char *> ( &salida ), sizeof ( PRUEBA ));
    sfichero.close ();
 
    cout <<  "Entrada final ->\t" <<  entrada.a << "\n";
    cout <<  "Salida final ->\t" <<  salida.a << "\n";
 
 
 
 
    cout << "Hello, world!\n";
}

Y lo compilo bajo Linux con:

1
g++ -std=c++11 -o prueba main.cpp -ggdb  -L/usr/X11R6/lib -lX11 -lGL -lglut

(La mayoría de los include y las opciones de compilación son "genéricas" de mi IDE)

Bueno ahora viene lo, para mi, sorprendente. El programa compila normalmente, pero cuando ejecuto la aplicacion la salida es:

1
2
3
4
5
6
7
8
9
10
*** Error in `../pruebas': double free or corruption (fasttop): 0x0000000000f41040 ***
Entrada antes ->	
Salida antes ->	
Entrada medio ->	pepe
Salida medio ->	
Entrada final ->	pepe
Salida final ->	pepe
Hello, world!
*** Colgado con el código: 0 ***

Osea... las salidas son las correctas ¿¿¡¡que pasa!!??

Añado. Si comento la parte donde se lee el fichero ( El fichero se crea igualmente ), el programa funciona correctamente y como se espera (Quedando la estructura "salida" como en un principio ).

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error en la lectura de archivos binarios

Publicado por Martín (65 intervenciones) el 01/09/2014 01:33:47
En la línea de comando con que compilas el programa pones -o prueba, mientras que en el mensaje de error se lee Error in `../pruebas'

¿No estarás compilando un programa y ejecutando otro?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error en la lectura de archivos binarios

Publicado por nDante (2 intervenciones) el 01/09/2014 21:12:27
Lo que comentas lo hice yo en el comentario para borrar la ruta real. De todas formas, lo he solucionado. Adjunto el código con las mínimas modificaciones para que funcione (Aunque en el proceso aprendí alguna cosa más que "abreviar")

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# include <iostream>
# include <string>
# include <fstream>
# include <math.h>
# include <ctime>
# include <dirent.h>
 
using namespace std;
 
 
const bool TRUE=1;
const bool FALSE=0;
struct PRUEBA
{
    PRUEBA ();
 
    string a;
    unsigned short int b;
    float c;
};
 
PRUEBA::PRUEBA ()
{
    a = "";
    b = 0;
    c = 0;
}
 
 
int main ()
{
 
    PRUEBA entrada;
    PRUEBA salida = new PRUEBA;
    string nombre_archivo = "prueba.pru";
 
 
    cout <<  "Entrada antes ->\t" <<  entrada.a << "\n";
    cout <<  "Salida antes ->\t" <<  salida->a << "\n";
 
    entrada.a = "pepe";
    entrada.b = 5;
    entrada.c = 2.3;
 
    ofstream efichero(  nombre_archivo.c_str (), ios::out | ios::binary);
    efichero.write (( char* ) &entrada, sizeof ( PRUEBA ));
    efichero.close ();
 
    cout <<  "Entrada medio ->\t" <<  entrada.a << "\n";
    cout <<  "Salida medio ->\t" <<  salida->a << "\n";
 
    ifstream sfichero(  nombre_archivo.c_str (), ios::in | ios::binary);
    sfichero.read (( char*  ) salida, sizeof ( PRUEBA ));
    sfichero.close ();
 
    cout <<  "Entrada final ->\t" <<  entrada.a << "\n";
    cout <<  "Salida final ->\t" <<  salida->a << "\n";
 
 
 
 
    cout << "Hello, world!\n";
}

Espero haber ayudado a alguien con el mismo problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar