【问题标题】:Writing a raw binary structure to file in D?将原始二进制结构写入D文件?
【发布时间】:2020-08-19 14:20:13
【问题描述】:

我正在尝试创建一个二进制文件,其中包含在某些struct 中定义的多个二进制记录。但是,我似乎无法找到如何做到这一点。查看其他示例,我已经成功地编写了strings,但不是struct。我只想像在Cfwrite(3) 中一样编写它,但在D 版本2 中。

这是我迄今为止尝试过的:

  • 使用stream.write(tr) - 编写人类可读/调试表示
  • 使用stream.rawWrite(tr) - 这听起来像我需要的,但无法编译:

错误:模板 std.stdio.File.rawWrite 无法从中推断出函数 参数类型 !()(TitleRecord),候选者是:

/usr/lib/ldc/x86_64-linux-gnu/include/d/std/stdio.d(1132):std.stdio.File.rawWrite(T)(在T[]缓冲区中)

  • 如上所述尝试rawWrite,但将数据转换为各种事物,也永远无法编译。
  • 甚至尝试使用fwrite 回到C,但无法深入到获取我需要的文件描述符。

阅读the docs 并没有太大帮助(写字符串对我也有用,但不写struct)。我确定必须有简单的方法来做到这一点,但我找不到它.... 其他 SO 问题did nothelp me。我D 1.0,它可能已经用stream.writeExact(&tr, tr.sizeof) 完成了,但这不再是一个选项。

import std.stdio;

struct TitleRecord {
        short id;
        char[49] text;
};

TitleRecord tr;

void main()
{
 auto stream = File("filename.dat","wb+");
 tr.id = 1234;
 tr.text = "hello world";
 writeln(tr);
 //stream.write(tr);
 //stream.rawWrite(tr);
 //stream.rawWrite(cast(ubyte[52]) tr);
 //stream.rawWrite(cast(ubyte[]) tr);
 //fwrite(&tr, 4, 1, stream);
}

【问题讨论】:

    标签: struct d


    【解决方案1】:

    为此,错误是说它需要一个数组而不是结构。因此,一种简单的方法是简单地将指针切片并将其提供给 rawWrite:

    stream.rawWrite((&tr)[0 .. 1]);
    

    (&tr) 获取地址,从而将您的结构转换为指针。然后[0 .. 1] 表示从一开始就获取它的一部分,只抓取一个元素。

    因此,您现在有了一个 T[],rawWrite 可以处理包含您的一个元素。

    请注意,如果您使用 @safe 注释,这将不会通过,您必须将其标记为 @trusted。当然,你的结构中的任何引用(包括string)都将被写为二进制指针,而不是你从 C 经验中肯定知道的数据。但如果你在那里展示你很好。

    编辑:顺便说一句,如果你愿意,你也可以只使用fwrite,从 C 复制/粘贴相同的代码(除了它是 foo.sizeof 而不是 sizeof foo)。 D File 只是 C 的 FILE* 的一个小包装,您可以使用 stream.getFP() http://dpldocs.info/experimental-docs/std.stdio.File.getFP.html 将原始 FILE* 取回传递给其他函数)

    【讨论】:

      【解决方案2】:

      rawWrite 需要一个数组,但有很多变通方法。

      一种是创建单元素数组。

      file.rawWrite([myStruct]);
      

      另一个是将结构转换为数组。我的名为 bitleveld 的库有一个名为 reinterpretAsArray 的函数。这也使得创建所述结构的校验和变得容易。

      我偶尔会遇到使用这种方法对齐的问题,所以要小心。可以通过更改结构的align 属性来修复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多