0

我可以假设使用 fwrite 生成并使用 fread 读取的文件可以跨不同系统移植吗?32 位/64 位 windows、osx、linux。

//dumping
FILE *of =fopen("dumped.bin","w");
double *var=new double[10];
fwrite(var, sizeof(double), 10,FILE);
//reading
file *fo=fopen()
double *var=new double[10];
fread(var,sizeof(double),10,of);

那么结构呢

struct mat_t{
    size_t x;
    size_t y;
    double **matrix;
}

这些是便携式的吗?

4

5 回答 5

5

简短的回答:

长答案:

您正在写出数据的二进制表示。
这不能跨平台或操作系统甚至编译器移植。

您编写的所有对象都有可以更改的内容:

int:        size and endianess.
double:     size and representation.
structure:  Each member has to be looked at individually.
            The structure itself may be padded different on different compilers.
            Or even the same compiler with different flags.
pointers:   Are meaningless even across processes on the same machine.
            All pointers have to be converted into something meaningful like
            a named object that is provided separately. The transport will then
            have to convert named objects into pointers at the transport layer
            at the destination.

您有两个主要选择:

  • 流式传输数据。
    这基本上是将结构转换为文本表示并发送字符串。对于小对象,API 结构是当前进行跨平台/语言通信的标准方法(尽管数据通常以 XML 或 Json 等某种格式包装)。
  • 转换为网络中立的二进制格式
    为此,我们有 htonl() 和函数族() 用于转换整数。双精度数更难,通常转换为两个整数(值取决于精度要求)。字符串被转换为一个长度,后跟一系列字符等。然后将每个字符串单独写入流。这可以比流式传输更紧凑(因此更高效)。不利的一面是,您将两端紧密耦合到非常特定的格式,因此使解决方案特别脆弱,并且在错误情况下更难以纠正。
于 2010-02-03T16:42:31.000 回答
4

fwrite并且fread非常便携,但是您会遇到诸如 之类的问题sizeof(double),这可能因系统而异。确保您编写的每个二进制字段都有一个不依赖于编译器或操作系统的已定义大小——您可以通过使用显式给出其大小的类型(例如uint32_t.

您还必须担心字节顺序,但是有宏ntoh, ntohl, hton,htonl可以用来为您交换字节顺序,并且它们应该被定义为在您编译它们的任何系统上都能正常工作。

于 2010-02-03T16:30:58.000 回答
1

该文件绝对不可移植。这就是为什么存在诸如hton之类的东西的原因。您必须确保您的文件格式非常清楚地指定了大小和字节序。由于单个类型不可移植,因此结构也不是(甚至不考虑struct packing)。

于 2010-02-03T16:29:40.143 回答
1

如果您正在编写结构,并且它们不是自包含的(意味着它们具有指针、子结构),那么使用某种序列化库会更好。有Boost Serilization库,它采用面向对象的方法。输出可以很容易地从文本切换到二进制,这使得调试更容易。

还有HDF5(分层数据格式),一组库,通常用于一些不寻常的硬件(不是标准 x86)上的科学计算。我从来没有用过这个,所以我不能说它是多么容易使用,但可以处理巨大的数据集(多 TB)。

于 2010-02-03T17:24:00.500 回答
0

您忘记了 Windows 假定文件写入处于文本模式,因此您需要将 fwrite() 的第二个参数中的“w”更改为“wb”

于 2010-02-03T16:50:58.397 回答