Aktuelle Zeit: 08.05.2024, 09:01

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Integer binär in Datei speichern
BeitragVerfasst: 13.01.2010, 23:35 
Offline

Registriert: 11.01.2010, 18:05
Beiträge: 11
Ich möchte Integer-Werte binär in eine Datei speichern. Das heist, wenn ich eine Variable "a" vom Typ "int" habe, der der Wert "98" zugeordnet wurde, dann soll nicht der String "98" in die Datei geschrieben werden, sondern wirklich das Byte mit dem Wert "98". Ein Texteditor würde dieses Byte in diesem Fall dann als "b" darstellen.
Das ganze geht ganz gut, solange es sich um einfache __int8 handelt, indem man sie in char`s konvertiert. Dummerweise möchte ich aber auch größere int`s speichern, also __int16 und __int32.

An sich sollte das ganz einfach sein, da die Daten ja sowieso schon binär sind und extra umgewandelt werden müssten um als String in die Datei gespeichert zu werden, trotzdem bin ich leider nicht in der Lage diese Umwandlung zu umgehen...

Würde mich sehr über Anregungen freuen.

Grüße, Lufti


Nach oben
 Profil  
 
BeitragVerfasst: 14.01.2010, 07:41 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Einfach direkt reinschreiben...

mit ofstream:
Code:
std::ofstream stream( "bla.bin", ios_base::binary );
int a = 98;

ofstream << a;
// oder
ofstream.write( &a );


mit irrlicht:
Code:
io::IWriteFile* file = fileSystem->createAndOpenFile( "bla.bin" );
int a = 98;

file->write( &a, sizeof(int) );

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 14.01.2010, 10:25 
Offline

Registriert: 11.01.2010, 18:05
Beiträge: 11
Leider nein. Der Code
Code:
ofstream stream( "bla.bin", ios_base::binary );
int a = 98;
stream << a;


schreibt auch den String "98" in die Datei.


Nach oben
 Profil  
 
BeitragVerfasst: 14.01.2010, 10:42 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
ok dann mit write

Code:
std::ofstream stream( "bla.bin", ios_base::binary );
int a = 98;

ofstream.write( &a, sizeof(int) );


Oder halt wenn es um Irrlicht geht mit dem andern Code.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 14.01.2010, 12:24 
Offline

Registriert: 11.01.2010, 18:05
Beiträge: 11
Vielen Dank schonmal! So geht es zwar auch nocht nicht, aber ich hab aber inzwischen rausgefunden wie es klappt. Du warst nah dran. ;-)
Was bei deiner zweiten Lösung gefehlt hat ist die reinterpretierung als (char*). So kann ich nun tatsächlich problemlos int´s beliebiger länge einspeichern. Was noch nicht klappt sind structures.

Code:
__int32 daten = 19778;
struct myStruct { [...] };
myStruct testStruct ;

[...]

ofstream test ("test.bin",ios::out | ios::binary);
test.write ((char*) &daten,2);                               //klappt wunderbar
test.write ((char*) &testStruct, sizeof(myStruct));   //klappt nicht so ganz
test.close();


Der Compiler kompiliert das ganze zwar anstandslos, auch schreibt das Programm dann tatsächlich entsprechend viele Bytes (sizeof(...) Bytes) in die Datei, allerdings sind diese alle Null.
Wenn ich einzelne Variablen von meiner structure anspreche (also statt "&testStruct" zu nehmen "&testStruct.Var1" benutze), dann klappt das wunderbar. Nun meine Frage, (wie) kann ich die ganze structure auf ein Mal in den Stream packen?

Grüße, Lufti


Nach oben
 Profil  
 
BeitragVerfasst: 14.01.2010, 13:33 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Hat myStruct irgendwelche Zeiger? Die können nämlich natürlich nicht in eine Datei gespeichert werden (also geht schon bringt nur nichts, weil die Speicheraddresse beim nächsten mal eine andere sein wird).

Der cast auf char* kommt mir auch ein wenig komisch vor... ich hab hier grad keinen c++ compiler zur Hand um das mal zu testen, aber iirc war ofstream::write() doch überladen...

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 14.01.2010, 15:51 
Offline

Registriert: 11.01.2010, 18:05
Beiträge: 11
Nein, die structure beinhaltet nur ein paar lokale variablen...


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de