Lagring i Binær fil

Tags:    c++ html html5

Hej alle sammen og godt nytår (hvis det altså ikke er for sent at sige det :P)...
Jeg er gået igang med at lave et lille project som skal kunne gemme informationer omkring DVD film i en binær fil som hedder DVDdatabase.dat...
Jeg kan huske at jeg engang så en person som havde lavet en "preformated" fil hvor han havde lavet 1000 records...
Jeg prøver nu selv at lave noget ligende.. jeg har derfor lavet en function som hedder formatDatabase() som "skulle" gå ind og lave en fil med 1000 rene accounts, jeg har så derefter lavet en lille function som hedder newDVD som gerne skulle gå ind og ligge noget i den første account (altså account 0) ...
jeg prøver derefter på at udskrive account 0 bagefter men intet sker...
Her er alt hvad jeg har lavet indtil vidre
DVDLibary.cpp
Fold kodeboks ind/udKode 


DVD.h
Fold kodeboks ind/udKode 

DVD.cpp
Fold kodeboks ind/udKode 


Jeg kan ikke selv finde ud af hvor det går galt, måske der er noget vigtigt som jeg har glemt/misforsået omkring lagring af data i en binær fil...
Jeg håber at der er nogen som kan finde fejlen eller måske bare guide mig hen imor en mulig løsning...

På forhånd tak!

Smox

[Redigeret d. 12/01-05 10:38:04 af Simon Rasmussen]



5 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
hehe jeg kan se at dHTML'en har lavet nogle små smillies i min kode, håber ikke at det er læsligt påtråds af det :D



1: Filen vil altid blive åbnet i main(), hvis den ikke eksisterede vil der blive lavet en tom fil (med mindre det ikke var muligt at oprette filen).

2: I DVD::newDVD starter du med at læse en record, men filen var tom så dette går ikke godt. Derfor er du nødt til at slette filens interne fejl flag (toDatabase.clear();) og spole tilbage til starten af den record du lige har læst (eller ville have læst) (toDatabase.seekg((0)*sizeof(DVD));).

3: Din DVD klasse indeholder 2 std::string's, når du skriver med toDatabase.write() skriver du kun std::string'ens interne data struktur og ikke indholdet af strengen. Du kan heller ikke læse indholdet af en std::string med toDatabase.read(), du bliver nødt til at læse og skrive de enkelte elementer i klassen for sig selv.

4: Det er en dårlig idé at bruge >> med char []'s




3: Din DVD klasse indeholder 2 std::string's, når du skriver med toDatabase.write() skriver du kun std::string'ens interne data struktur og ikke indholdet af strengen. Du kan heller ikke læse indholdet af en std::string med toDatabase.read(), du bliver nødt til at læse og skrive de enkelte elementer i klassen for sig selv.


Nu ser det ud til at jeg får lavet filen rigtigt for jeg kan nu gemme heltal (integers) i filen og nu finde dem frem igen ... du skrev så her sidste gang at jeg skulle være opmærksom på mine strings og det er lige præsis mit problem nu for de bliver nemlig ikke gemt rigtigt ...

Koden til hvor jeg ligger data i account 0
Fold kodeboks ind/udKode 

Koden som viser dataen igen:
Fold kodeboks ind/udKode 

Hvis jeg kunne få dig til at beskrive hvordan jeg skal lagre/printe mine strings rigtigt ville det være til en MEGET stor hjælp!

På forhånd tak!

Smox



Jeg ville gøre noget i stil med:

Først skrive:
std::string Str; // String to write
//Make sure that str is no longer than 255 bytes:
if(Str.size() > 255)
Str = Str.sub_str(0, 255);

// Write the string part
char Temp[256];
strcpy(temp, Str.c_str());
out.write(Temp, strlen(Temp) + 1); // Make sure to write a 0 byte at the end.

// pad with dummy, as we must write 256 bytes (could use seek)
char Dummy:
for(int i = strlen(Temp); i < 256; i++)
out.write(&Dummy, 1);

For at læse:
in.read(Temp, 256);
std::string DestStr = Temp;



Jeg lavede lige et komplet eksempel:

Fold kodeboks ind/udKode 




t