2010-10-05 15 views
9

Wie lesen und schreiben Sie Binärdateien in D-Sprache? In C wäre:Binärdatei-E/A


    FILE *fp = fopen("/home/peu/Desktop/bla.bin", "wb"); 
    char x[4] = "RIFF"; 

    fwrite(x, sizeof(char), 4, fp); 

Ich fand rawwrite bei D docs, aber ich weiß nicht, die Nutzung, noch wenn das tut, was ich denke. fread ist aus C:

T [] rawRead (T) (T [] buffer);

Wenn die Datei nicht geöffnet wird, wird eine Ausnahme ausgelöst. Andernfalls ruft fread für das Dateihandle auf und löst einen Fehler aus.

rawRead wird immer im Binärmodus unter Windows gelesen.

Antwort

7

rawRead und rawwrite sollte genau wie fread, fwrite verhalten, nur sind sie Vorlagen Pflege Argumentations Größen und Längen zu nehmen.

z.B.

auto stream = File("filename","r+"); 
auto outstring = "abcd"; 
stream.rawWrite(outstring); 
stream.rewind(); 
auto inbytes = new char[4]; 
stream.rawRead(inbytes); 
assert(inbytes[3] == outstring[3]); 

rawRead wird in Form von fread implementiert als

T[] rawRead(T)(T[] buffer) 
    { 
     enforce(buffer.length, "rawRead must take a non-empty buffer"); 
     immutable result = 
      .fread(buffer.ptr, T.sizeof, buffer.length, p.handle); 
     errnoEnforce(!error); 
     return result ? buffer[0 .. result] : null; 
    } 
+0

Danke für die tolle Antwort. –

+0

Was ist, wenn Ihre Daten bereits im Speicher sind (von einem API-Anruf empfangen) anstatt auf der Festplatte? Das Stream-API unterstützt nicht rawRead und es gibt keinen Datei-Handle, der an .fread übergeben werden kann. –

2

Wenn Sie gerade in einem großen Puffer Werte lesen wollen (sagen wir, Ints), können Sie einfach tun:

int[] ints = cast(int[]) std.file.read("ints.bin", numInts * int.sizeof); 

und

std.file.write("ints.bin", ints); 

natürlich, wenn yo Wenn Sie mehr strukturierte Daten haben, ist die Antwort von Scott Wales angemessener.