Ik heb laatst een C++ boek gekocht, doorgelezen, en veel van geleerd. Nu wilde ik voor mezelf een programmaatje schrijven, met o.a. het binair opslaan van klassen.
Nu heb ik een klasse met een string, die ik binair wil opslaan. De string van de klasse wordt echter niet getoond na een aanroep daartoe, gegeven na het halen van de klasse uit de string. Andere gegevens werken wel.
Voor een demonstratie volgt hier een aangepast stukje code uit het boek, met strings ipv cstrings (en ios_base::binary weggelaten, hoeft niet met linux). (overigens is niet uitgelegd wat de reinterpret_cast<char *> hier precies doet, dat snap ik ook niet helemaal dus wellicht dat ik daar wat fout doe):
Writeobj.cpp (schrijft klasse naar bestand.dat):
Readobj.cpp (leest het weer uit):
Compiled perfect met g++.
Geen output bij writeobj.cpp (natuurlijk)
en readobj.cpp doet dit:
faberic@faberic:~/C++$ ./read
moet nog 0.01
moet nog 312.59
hij toont dus geen strings. Vervang je de strings door een cstring (en de initialisatie door een strcpy) dan werkt het wel.
Nu heb ik een klasse met een string, die ik binair wil opslaan. De string van de klasse wordt echter niet getoond na een aanroep daartoe, gegeven na het halen van de klasse uit de string. Andere gegevens werken wel.
Voor een demonstratie volgt hier een aangepast stukje code uit het boek, met strings ipv cstrings (en ios_base::binary weggelaten, hoeft niet met linux). (overigens is niet uitgelegd wat de reinterpret_cast<char *> hier precies doet, dat snap ik ook niet helemaal dus wellicht dat ik daar wat fout doe):
Writeobj.cpp (schrijft klasse naar bestand.dat):
code:
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
| #include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int AANTAL_OBJECTEN = 15;
class notitie
{
public:
string naam;
float schuld;
void toon() {cout << naam << " moet nog " << schuld << endl;}
};
int main()
{
notitie object_tabel[AANTAL_OBJECTEN];
ofstream bestand("bestand.dat");
if (!bestand.is_open()) {
cerr << "Fout: Bestand niet kunnen aanmaken." << endl;
exit(1);
}
object_tabel[0].naam = "Rudi Claes";
object_tabel[0].schuld = 0.01;
object_tabel[1].naam = "Jan Nathan";
object_tabel[1].schuld = 312.59;
bestand.write(reinterpret_cast<char *> (object_tabel),
AANTAL_OBJECTEN * sizeof(notitie));
bestand.close();
return 0;
} |
Readobj.cpp (leest het weer uit):
code:
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
| #include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int AANTAL_OBJECTEN = 15;
class notitie
{
public:
string naam;
float schuld;
void toon() {cout << naam << " moet nog " << schuld << endl;}
};
int main()
{
notitie object_tabel[AANTAL_OBJECTEN];
ifstream invoerstroom("bestand.dat");
if (!invoerstroom.is_open()) {
cerr << "Fout: Bestand niet kunnen openen." << endl;
exit(1);
}
invoerstroom.read(reinterpret_cast<char *> (object_tabel),
AANTAL_OBJECTEN * sizeof(notitie));
object_tabel[0].toon();
object_tabel[1].toon();
invoerstroom.close();
return 0;
} |
Compiled perfect met g++.
Geen output bij writeobj.cpp (natuurlijk)
en readobj.cpp doet dit:
faberic@faberic:~/C++$ ./read
moet nog 0.01
moet nog 312.59
hij toont dus geen strings. Vervang je de strings door een cstring (en de initialisatie door een strcpy) dan werkt het wel.
[ Voor 15% gewijzigd door Verwijderd op 25-07-2005 19:19 ]