【问题标题】:Binary file I/O二进制文件 I/O
【发布时间】:2010-10-05 02:54:34
【问题描述】:

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


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

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

我在 D docs 找到 rawWrite,但我不知道用法,也不知道我的想法。 fread 来自 C:

T[] rawRead(T)(T[] 缓冲区);

如果文件未打开,则抛出异常。否则,为文件句柄调用 fread 并抛出错误。

rawRead 在 Windows 上始终以二进制模式读取。

【问题讨论】:

    标签: io d


    【解决方案1】:

    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 as 来实现的

     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 ...
    【解决方案2】:

    如果你只是想读入一个大缓冲区的值(比如整数),你可以这样做:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2016-06-15
      • 2015-01-29
      • 1970-01-01
      • 2012-05-28
      • 2012-05-05
      相关资源
      最近更新 更多