Text Binär abspeichern
-
Hallo!
Ich hab folgendes Problem:
Und zwar möchte ich nehmen wir mal an Einen Text aus einem String in einem File
speichern, soweit so gut nur sollte es den Text im File binär speichern sprich
es sollte im Text dann nicht "Testtext" stehen sondern nur 0en und 1en entsprechend dem Text.Das man jedes einzelnes char zeichen des Stringes mit
itoa(Asciizahl, bin, 2);umwandeln kann ist mir klar doch dachte ich eher
an eine möglichkeit das den compiler automatisch machen zu lassen da er doch auch
mitfopen("PFAD","wb");er den Text binär überträgt und ins File speichert oder ihre ich mich da?
Also suche ich ne möglichkeit meinen text ins file zu speichern und zwar so das er dort binär vorhanden ist.mfg Exigo
-
Ich glaube, du hast eine falsche Vorstellung von "Binärdaten" - der Computer arbeitet nur mit Nullen und Einsen (allerdings fasst er diese zu größeren Gruppen zusammen, die er geschlossen betrachtet - so wird aus 8 einzelnen Ziffern ein Buchstabe).
-
Soweit war mir das schon klar nur mein ich jetzt ausschließlich den Text im FIle selber. Nehmen wir an ich hab ein Test.txt und einen string wo "Testtext" drinnen steht.
In das Textfile speicher ich jetzt meinen string ab mit von mir aus
fprintf(stream,"%s",string);nun steht im Test.txt Testtext drinen.
Ich will jetzt erreichen das im Test.txt "Testtext" drinnen steht nur halt mit den entsprechenden 0en und 1en.
mfg
-
In der Datei steht doch eine Folge von Nullen und Einsen - nur jeweils 8 zusammengequetscht zu einem Zeichen. Wenn du die direkt sehen willst, mußt du die Datei auch wieder einlesen und die Bits einzeln betrachten.
Wenn du die Datei als Folge von ASCII-Zeichen '0' und '1' haben willst, ist Handarbeit gefragt - eventuell kannst du noch Hilfe von einem bitset<> bekommen.
-
Wenn du die Datei als Folge von ASCII-Zeichen '0' und '1' haben willst, ist Handarbeit gefragt - eventuell kannst du noch Hilfe von einem bitset<> bekommen.
Genau das meinte ich

Ok die Lösung mit der Handarbeit hatte ich schon wollte blos wissen obs ne schnellere variante gibt die vlt im compiler schon integriert ist trotzdem danke!mfg
-
Es gibt sogenannte bitfelder, in denen man dem Compiler sagen kann, dass ein integer in einem Struct nur N bits belegt. Beispiel:
struct BitsImByte { unsigned int bit1 : 1; //bit1 belegt nur 1 bit unsigned int bit2 : 1; unsigned int bit3 : 1; unsigned int bit4 : 1; unsigned int bit5 : 1; unsigned int bit6 : 1; unsigned int bit7 : 1; unsigned int bit8 : 1; };Das Ding sollte nur einen Byte (8 bit) Speicher belegen.
In Zusammenarbeit mit einem union laesst sich da vielleicht was schnelles reissen:union { char c; BitsImByte bits; } bbc; std::string str = "holla die Waldfee"; for (int i = 0; i < str.length(); i++) { bbc.c = str[i]; cout << bbc.bits.bit1 << bbc.bits.bit2 << bbc.bits.bit3 << bbc.bits.bit4 << bbc.bits.bit5 << bbc.bits.bit6 << bbc.bits.bit7 << bbc.bits.bit8 << ' '; } cout << endl;In einer union teilen sich alle member den selben Speicher. sprich: bbc belegt 1 byte, wobei bbc.c diesen byte als char interpretiert, bbc.bits jedoch als BitsImByte struct mit 8 einzelnen Bits. Im obrigen Schnipsel wird also erst das byte gesetzt so wie der Compiler den einzelen char interpretiert, danach dann jedes einzelne bit ausgegeben. Vorsicht: es handelt sich hierbei um 0 und 1, nicht um '0' und '1'. cout wandelt die unsigned ints nur in lesbare Zeichen um.
Ich weiss allerdings leider nicht, wieviel davon vom Standard garantiert wird.
-
Vermutlich ist schon der Ansatz nicht standardkonform - in einer union hat nur das Element gültige Werte, das als letztes gefüllt wurde.
Aber es gibt eine Klasse, mit der man das Problem wesentlich eleganter lösen kann - bitset<>:
std::string str = "holla die Waldfee"; for (int i = 0; i < str.length(); i++) { std::bitset<8> bin = str[i]; cout << bin << ' '; }
-
In manchen momenten verfluche ich C++ und seine Logik!
Aber in Momenten wie diesen kann ich nur sagen:Ein
hoch auch die C++-Standard-library!