Binär Dateien
-
Bei folgenden Beispielen:
ZEICHEN
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string save; string test="Bahnhof"; getline(cin,save); ofstream file(save.c_str(), ios::out | ios::binary); file.write(test.c_str(),sizeof(test.c_str())); return 0; }Im Windows Texteditor:
Bahn
ZAHL
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string save; int test=90768; getline(cin,save); ofstream file(save.c_str(), ios::out | ios::binary); file.write(reinterpret_cast<char*>(&test),sizeof(test)); return 0; }Im Windows Texteditor:
�b
Die Erklärung von "DeSoVoDaMu" klingt ganz plausibel find ich.
Was ich nur noch nicht verstehe, ist das bei Zeichen nur 4 angezeigt werden. Oben im Code z.B. bei "Bahnhof", im Texteditor da nur "Bahn"...? Warum?MfG
Stromberg
-
Stromberg schrieb:
file.write(test.c_str(),sizeof(test.c_str()));
Liegt wohl am sizeof. Wie wärs denn mit <<-Operator?
string bla = "bla"; ofstream file("bla.txt",...); file<<bla;
-
Stromberg schrieb:
file.write(test.c_str(),sizeof(test.c_str()));
Wie ich schon sagte, sizeof() liefert falsche (aka für dich unbrauchbare) Werte. Genau genommen liefert es die Größe eines char-Zeigers (auf deinem System konstant 4 Byte) - und nicht die Größe des dahinterliegenden Speicherbereichs (hängt vom Inhalt des gespeicherten Strings ab). Wenn du unbedingt mit write() arbeiten willst, brauchst du die korrekte Länge:
file.write(test.c_str(),test.length());PS: Und du solltest bedenken, daß du die Länge des Strings mit abspeichern solltest, wenn das Programm ihn später wieder auslesen soll.
-
Hallo,
was ist eigentlich der Unterschied zwischen Binär- und ASCII-Dateien?
Ich weiß...ASCII-Dateien kann ich mit einem "normalen" Texteditor öffnen, bzw. lesen und Binärdateien nicht...
aber gibt es auch noch andere Unterschiede wie z.B. die entstehende Dateigröße bei gleicher Datenmenge?
In eine ASCII-Datei kann ich relativ einfach formatierten Text ablegen:
z.B. file << left << setfill('0') << fixed << setw(8)<<(double)timestamp/1000 <<" "<< kanal <<" " << endl;Ist dies auch bei Binär-Dateien möglich?
(Der Aufbau bzw. die Formatierung wäre in diesem Fall extrem wichtig, da die Datei mit einem externen Programm wieder geöffnet werden soll, dass penibel auf diese Formatierung achtet)
Ich freue mich auf Antworten...evtl. mit kurzem Code-Beispiel

Viele Grüße
Sascha
-
...
-
...Sorry wg mehrfachem Posting...mein Browser wollte irgendwie nicht...

-
EntonH schrieb:
Hallo,
was ist eigentlich der Unterschied zwischen Binär- und ASCII-Dateien?
Ich weiß...ASCII-Dateien kann ich mit einem "normalen" Texteditor öffnen, bzw. lesen und Binärdateien nicht...
aber gibt es auch noch andere Unterschiede wie z.B. die entstehende Dateigröße bei gleicher Datenmenge?
In eine ASCII-Datei kann ich relativ einfach formatierten Text ablegen:
z.B. file << left << setfill('0') << fixed << setw(8)<<(double)timestamp/1000 <<" "<< kanal <<" " << endl;Ist dies auch bei Binär-Dateien möglich?
(Der Aufbau bzw. die Formatierung wäre in diesem Fall extrem wichtig, da die Datei mit einem externen Programm wieder geöffnet werden soll, dass penibel auf diese Formatierung achtet)
Ich freue mich auf Antworten...evtl. mit kurzem Code-Beispiel

Viele Grüße
SaschaIn Textdateien werden z.B. Werte alphanumerisch codiert abgelegt. Dass heißt, wenn man eine int-Variable mit dem Wert 100 in eine Text-Datei schreibt, werden daraus die Characters 1 0 0 generiert. Bei Binär-Dateien wird hingegen die binäre Repräsentation davon abgelegt. Bei 100 (Big Endian) wäre das:
0000 0000 0000 0000 0000 0000 0110 0100Dabei muss man dann auch noch die "endianess" der Plattform beachten, d.h. es kann sein, dass das High-Byte in den hintersten vier Digits steht und das Low-Byte in den vordersten (Little Endian). Es ist also auch noch plattformabhängig.
Zu guter Letzt werden bei Textdateien i.d.R. auch noch bestimmte Steuerzeichen interpretiert. Z.B. End Of Line.EDIT: Lord Jaxom hat in dem Post unter mir natürlich recht. Technisch gesehen gibt es bei den Dateien an sich erstmal gar keinen Unterschied. Der Unterschied kommt durch die programmseitige Interpretation der Datei zusatande.
-
EntonH schrieb:
was ist eigentlich der Unterschied zwischen Binär- und ASCII-Dateien?
Technisch gesehen keiner.
Textdateien zeichnen sich dadurch aus, dass die Bytes, die sie enthalten, nur lesbaren Zeichen entsprechen, manchmal in Mustern angeordnet, welche das menschliche Gehirn als "Wörter" oder "Sätze" identifizieren kann.
Binärdateien enthalten alle möglichen Bytes, auch solche, die keine lesbare Entsprechung haben, weshalb sie in einem Texteditor wie Zeichensalat aussehen.
In eine ASCII-Datei kann ich relativ einfach formatierten Text ablegen:
z.B. file << left << setfill('0') << fixed << setw(8)<<(double)timestamp/1000 <<" "<< kanal <<" " << endl;Ist dies auch bei Binär-Dateien möglich?
Siehe oben. Die Datei ist binär sobald Du ein nicht lesbares Zeichen vor oder hinter die formatierte Ausgabe schreibst.
(Der Aufbau bzw. die Formatierung wäre in diesem Fall extrem wichtig, da die Datei mit einem externen Programm wieder geöffnet werden soll, dass penibel auf diese Formatierung achtet)
Und dieses Programm braucht formatierte Binärdateien?!?

...Sorry wg mehrfachem Posting...mein Browser wollte irgendwie nicht...

Das liegt nicht an Deinem Browser

-
Danke für die Antworten.
Aber wenn das Programm die ASCII-Dateien formatiert haben möchte, um sie richtig interpretieren zu können, muss ich dann nicht auch die Daten in der Binärdatei in irgendeiner Art und Weise formatiert ablegen, damit das Programm sie interpretieren kann?
-
EntonH schrieb:
Danke für die Antworten.
Aber wenn das Programm die ASCII-Dateien formatiert haben möchte, um sie richtig interpretieren zu können, muss ich dann nicht auch die Daten in der Binärdatei in irgendeiner Art und Weise formatiert ablegen, damit das Programm sie interpretieren kann?Das macht normalerweise (wenn du keine Flags angibst) ofstream für dich. Aber wenn du jetzt z.B binär was schreiben möchtest, dann gibst du da das entsprechende Flag mit an. (Dann kannst du das einfach nicht mehr lesen im Editor).
-
Ah, sorry. Ich bin bei der "Formatierung" hier automatisch von Textformatierung ausgegangen.
Natürlich musst Du, damit mehrere Programme die gleiche Binärdatei (bzw. besser: Das gleiche Dateiformat) lesen und schreiben können, festlegen wie dieses Format auszusehen hat. Dabei brauchst Du aber selten Funktionen zum Formatieren (wie setprecision o.ä.), sondern eher geeignete Binärrepräsentationen.
Es könnte z.B. festgelegt sein, dass ein Bild-Dateikopf wie folgt aufgebaut ist:
Bytes 0-4 Magic Code (Bytefolge 'I' 'M' 'A' 'G') 5-8 4 Byte Bildbreite (Little-Endian) 9-12 4 Byte Bildhöhe (Little-Endian) 13 1 Byte Farbtiefe angegeben als 2^x Farben usw.
-
Hmm...also sieht die Formatierung ganz anders aus als zuvor...dann kann ich das doch gar nicht selbst so formatieren wie es der Hersteller des externen Programms in der Input-Datei erwartet, oder...?
Ich dachte man könnte die ASCII-Formatierung irgendwie verwenden können, um sich anhand dessen die Binärdatei zusammen zu schustern...
-
EntonH schrieb:
Hmm...also sieht die Formatierung ganz anders aus als zuvor...dann kann ich das doch gar nicht selbst so formatieren wie es der Hersteller des externen Programms in der Input-Datei erwartet, oder...?
Ich dachte man könnte die ASCII-Formatierung irgendwie verwenden können, um sich anhand dessen die Binärdatei zusammen zu schustern...
Dafür brauchst du, wie schon erwähnt eine Binärrepräsentationen, anhand der du dann das binär einlesen kannst. Das Problem, welches du hast, ist das gleiche, wie der Texteditor. Er weiss jetzt nicht, ob z.B die ersten 4 Bytes eine Zahl sind, oder 4 Zeichen. Der Editor macht es sich dann einfach und nimmt einfach jedes Byte als Zeichen und das was es gibt ist das, was du siehst. (Meist nur Mist. ;)).
Um das sinnvol nutzen zu können, muss der "Schreiber" der Datei das auch kommunizieren. Z.B hier:
http://de.wikipedia.org/wiki/Windows_BitmapHier siehst du wie eine Windows Bitmap aufgebaut ist.