Struct 将原始二进制结构写入D中的文件?

Struct 将原始二进制结构写入D中的文件?,struct,d,Struct,D,我试图创建一个二进制文件,其中包含一些在结构中定义的二进制记录。然而,我似乎不知道如何去做。看看其他例子,我成功地编写了字符串,但没有遇到任何问题。我只想用C和fwrite3编写它,但要用D版本2 以下是我到目前为止所做的尝试: 使用stream.writetr-编写人类可读/调试表示 使用stream.rawritetr-这听起来像我需要的,但无法使用以下工具编译: 错误:模板std.stdio.File.rawrite无法从 参数类型!TitleRecord,候选人包括: /usr/lib/

我试图创建一个二进制文件,其中包含一些在结构中定义的二进制记录。然而,我似乎不知道如何去做。看看其他例子,我成功地编写了字符串,但没有遇到任何问题。我只想用C和fwrite3编写它,但要用D版本2

以下是我到目前为止所做的尝试:

使用stream.writetr-编写人类可读/调试表示 使用stream.rawritetr-这听起来像我需要的,但无法使用以下工具编译: 错误:模板std.stdio.File.rawrite无法从 参数类型!TitleRecord,候选人包括:

/usr/lib/ldc/x86_64-linux-gnu/include/d/std/stdio.d1132:std.stdio.File.rawritetin T[]缓冲区

如上所述尝试rawWrite,但将数据转换为各种内容,也无法编译。 甚至尝试用fwrite返回到C,但无法深入到足够的深度来获取所需的文件描述符。 阅读对我来说并不是很有帮助。写字符串对我来说也很有用,但写结构就不行了。我相信一定有简单的方法,但我找不到。。。。其他问题也是如此。在ID1.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);
}

对于这个错误,它说它需要一个数组而不是一个结构。因此,一个简单的方法是简单地将指针切片并将其交给rawrite:

stream.rawWrite((&tr)[0 .. 1]);
&tr获取地址,从而将结构转换为指针。然后,[0..1]表示从一开始就获取一个片段,只获取一个元素

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

注意:如果您使用@safe注释,则此注释将不会通过,您必须将其标记为@trusted。当然,结构中的任何引用(包括字符串)都将被写为二进制指针,而不是数据,正如您从C语言经验中所了解的那样。但如果你在那里展示的话,你很好


编辑:顺便说一句,如果您愿意,您也可以使用fwrite,从C复制/粘贴相同的代码,除了它是foo.sizeof而不是sizeof foo。D文件只是C文件*的一个小包装器,您可以使用stream.getFP将原始文件*返回给其他函数,因为这个错误表示它需要的是数组而不是结构。因此,一个简单的方法是简单地将指针切片并将其交给rawrite:

stream.rawWrite((&tr)[0 .. 1]);
&tr获取地址,从而将结构转换为指针。然后,[0..1]表示从一开始就获取一个片段,只获取一个元素

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

注意:如果您使用@safe注释,则此注释将不会通过,您必须将其标记为@trusted。当然,结构中的任何引用(包括字符串)都将被写为二进制指针,而不是数据,正如您从C语言经验中所了解的那样。但如果你在那里展示的话,你很好

编辑:顺便说一句,如果您愿意,您也可以使用fwrite,从C复制/粘贴相同的代码,除了它是foo.sizeof而不是sizeof foo。D文件只是C文件*的一个小包装器,您可以使用stream将原始文件*拿回来传递给其他函数。getFP

rawrite需要一个数组,但有很多解决方法

一种是创建单个元素数组

file.rawWrite([myStruct]);
另一个是将结构强制转换为数组。我的名为bitleveld的库有一个名为reinterpretAsArray的函数。这也使得创建所述结构的校验和变得容易

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

rawrite需要一个数组,但有许多解决方法

一种是创建单个元素数组

file.rawWrite([myStruct]);
另一个是将结构强制转换为数组。我的名为bitleveld的库有一个名为reinterpretAsArray的函数。这也使得创建所述结构的校验和变得容易

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