二进制文件输入输出

10

如何在D语言中读写二进制文件?在C中是:


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

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

我在Ddocs中找到了rawWrite,但我不知道它的用法,也不确定它是否符合我的想法。fread来自C: T[] rawRead(T)(T[] buffer); 如果文件未打开,则会抛出异常。否则,为文件句柄调用fread并在出现错误时抛出异常。
rawRead始终在Windows上以二进制模式读取。
2个回答

8

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;
    }

如果您的数据已经在内存中(从API调用接收),而不是在磁盘上,该怎么办?Stream API不支持rawRead,并且没有文件句柄可传递给.fread... - Jason Sundram

2

如果您只想读取大量数值(例如,整数),可以简单地执行以下操作:

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

并且

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

当然,如果您有更为结构化的数据,那么Scott Wales的回答更为合适。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接