2010-10-05 92 views
9

如何讀取和寫入D語言的二進制文件?在C是:二進制文件I/O


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

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

我發現rawWrite在d docs,但我不知道使用方法,也不如果它是我的想法。 fread來自C:

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

如果文件未打開,則會引發異常。否則,請爲文件句柄調用fread並引發錯誤。

rawRead在Windows上始終以二進制模式讀取。

回答

7

rawRead和rawWrite應該完全一樣的fread,fwrite的,只有他們是模板以參數尺寸和長度的照顧。

例如

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在FREAD方面實現

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

感謝您的好評。 – 2010-10-05 04:56:46

+0

如果您的數據已經在內存中(從api調用接收)而不是在磁盤上,該怎麼辦? Stream api不支持rawRead,並且沒有文件句柄傳遞給.fread ... – 2014-09-23 02:02:10

2

如果你只是想在值(比方說,整型),你可以簡單地做一個大的緩衝區讀取:

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

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

當然,如果喲你有更多的結構化數據,那麼斯科爾威爾士的答案更合適。