2017-01-13 1 views
1

Ich möchte eine Datei erstellen und "A" in es schreiben (ascii ist 65 == 01000001). Seltsame Tatsache, was auch immer der Wert von std::string binary ist, wird immer der Buchstabe P in myfile.txt geschrieben.fwrite binäre Daten von einer Zeichenfolge

std::string binary = "01000001"; 
    std::string file = "myfile.txt"; 
    FILE* f; 
    f = fopen(file.c_str(), "wb");  
    fwrite(&binary, 1, 1, f);  
    fclose(f); 

Nach der Ausführung dieses Codes, lese ich binäre Daten mit dem Befehl xxd -b myfile und ich bekomme diese:

00000000: 01010000

Haben Sie auf diesem Code sehen, ein Problem?

+1

Warum nicht verwenden C-Style Saiten direkt? (Witz - du verwendest keine C++ - Streams) Du hast 'fopen (file.c_str() ... ', aber' fwrite (& binary ... '. Einer von ihnen ist falsch. – LogicStuff

+1

Glaubst du, dass es sein könnte einfacher mit ostream zu arbeiten? – Milow

+0

Die 'binary' Variable ist ein String, der die ASCII-Darstellung von" 01000001 "enthält. Dies ist keine Zahl ist TEXT. Um" A "in die Datei zu schreiben, sollten Sie' binary = "A" verwenden 'und dann' fwrite (binary.c_str(), 1,1, f) !!! Aber ich denke, Sie würden Binär in seinem ASCII-Wert beginnend mit dem Binärwert konvertieren –

Antwort

1

Strings sind schlecht, wenn man einen Bitstrom tun wollen ...

int8_t binary = 0b01000001; 
std::string file = "myfile.txt"; 
FILE* f; 
f = fopen(file.c_str(), "wb");  
fwrite(&binary, 1, 1, f);  
fclose(f); 

Aber wenn Sie C++ verwenden, Sie nicht wirklich brauchen, C-Bibliotheken

#include <fstream> 

int main() 
{ 
    std::fstream f; 
    std::string file = "myfile.txt"; 
    f.open(file, std::fstream::out | std::fstream::binary); 
    int8_t binary = 0b01000001; // int8_t is required to only write 8 bits/1 byte 
    f << binary; 
    f.close(); 
    return 0; 
} 
+0

Ihr 'fwrite' Aufruf sollte' & binary' anstelle von 'binary' übergeben werden – pcarter

4
fwrite(&binary, 1, 1, f); 

Sie übergeben einen Zeiger des std::string-fwrite, das ist schlecht.

Sie c_str() durch den Aufruf einen Zeiger auf den internen Puffer des Strings erhalten möchten:

fwrite(binary.c_str(), 1, 1, f); 

Dies ist ein weiterer Grund ist, nicht C Datei-Handles, fwrite s erste Argument zu verwenden, ist ein const void* das ist Warum hat dein Compiler dir überhaupt keinen Fehler gegeben?

+1

Mit seinem aktuellen Code wird dies das Zeichen "0" schreiben, nicht "A", wie er sagt, dass er schreiben möchte. – pcarter

+1

@pcarter ist richtig, binary.c_str() schreibt '0'. – Milow