2010-12-12 22 views
0

Wenn ich versuche, die Datei mit C schreiben; fwrite, die void Typ als Daten akzeptiert, wird nicht vom Texteditor interpretiert.Schreiben in Datei mit C und C++

struct index 
{ 
    index(int _x, int _y):x(_x), y(_y){} 
    int x, y; 
} 

index i(4, 7); 

FILE *stream; 
fopen_s(&stream, "C:\\File.txt", "wb"); 
fwrite(&i, sizeof(index), 1, stream); 

aber wenn ich mit C++ versuche; Ofstream write im Binärmodus, ist es lesbar. Warum kommt es nicht wie mit fwrite geschrieben?

+1

Klingt so, als hätten Sie 'fwrite' falsch verwendet. Kannst du etwas Code posten? –

+0

Ich habe für 'fwrite' gepostet. – user963241

+0

Was ist dein 'Stream'? – chrisaycock

Antwort

0

Dies ist die Art und Weise Binärdaten in C++ unter Verwendung eines Stream zu schreiben:

Dies soll das Objekt in der gleichen Weise wie fwrite speichern würde
struct C { 
    int a, b; 
} c; 

#include <fstream> 
int main() { 

    std::ofstream f("foo.txt",std::ios::binary); 
    f.write((const char*)&c, sizeof c); 
} 

. Wenn es nicht für Sie ist, schreiben Sie bitte Ihren Code mit Streams - wir werden sehen, was falsch ist.

+0

@Kos Ich habe versucht, f << c überladen, Einfügen von dann b. – user963241

+0

Oh, das erklärt, warum Sie die Textausgabe erhalten haben. Wenn Sie eine rohe binäre Ausgabe wünschen, wissen Sie, was Sie jetzt tun müssen. – Kos

+0

Ich schrieb zwei Dateien mit dem C- und C++ - Dateistream im rohen Binärmodus, aber wieso ist eine Datei, die mit C geschrieben wurde, 90% größer als die, die ich mit C++ geschrieben habe? – user963241

0

C++ 's ofstream Stream Insertion tut nur Text. Der Unterschied zwischen dem Öffnen eines Iostreams im binären Modus und dem Textmodus besteht darin, dass das Wetter oder nicht die Zeichenumwandlung am Ende der Zeile erfolgt. Wenn Sie ein Binärformat schreiben wollen, in dem ein 32-Bit-Int genau 32 Bit benötigt, verwenden Sie die c-Funktionen in C++.

bearbeiten, warum Fwrite die bessere Wahl sein kann:

Ostream des Schreibverfahren ist mehr oder weniger ein Klon von fwrite (außer es ist etwas weniger nützlich, da es nur einen Byte-Array und Länge statt Fwrite der dauert 4 params), aber indem man bei fwrite bleibt, gibt es keine Möglichkeit, die Stream-Insertion versehentlich an einer Stelle zu verwenden und in einer anderen zu schreiben. Mehr noch, es ist ein Sicherheitsmechanismus. Während Sie diesen Sicherheitsspielraum gewinnen, verlieren Sie ein wenig an Flexibilität. Sie können nicht länger ein Iostream-Derivat erstellen, das die Ausgabe komprimiert, ohne den Code zum Schreiben von Dateien zu ändern.

+0

Unwahr, C++ - Stream-Objekte sind auch für binäre Daten perfekt geeignet ... Ein Grund, sie C-Alternativen vorzuziehen, ist die Sicherheit, wenn die Datei im Destruktor des Objekts geschlossen ist. – Kos

+0

@Kos fähig, wahr, aber fwrite bietet die bessere Schnittstelle. – stonemetal