2010-10-05 93 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); 

当然,如果哟你有更多的结构化数据,那么斯科尔威尔士的答案更合适。