0

我知道以下方法可能不可移植,但这正是我现在想知道的。想象一下我有一些数据结构

struct student
{
    char name[20];
    int age;
} x;

现在我想把它写到这样的文件中:

fwrite(&x, sizeof(student), 1, filePointer);

类似地阅读:

fread(voidPointer, sizeof(student), 1, filePointer);
// Now possibly do a memcpy
memcpy(studentObjectPointer, voidPointer, sizeof(student));

我的问题是:假设我不想将此文件复制到另一台计算机,我将从创建此文件的同一台计算机中读取它。可移植性(字节序、打包数据结构)问题是否仍适用于上述方法?或者它会正常工作?

4

2 回答 2

1

如果将文件复制到其他机器上,您将必须构建自己的序列化器和序列化器。使用您提供的结构,它非常简单。

您必须定义在编写数字时采用哪种字节顺序(此处为int age)。在这里,您可以这样处理:

  1. 以二进制模式打开文件
  2. name写入字符串的 20 个字节
  3. ageCHOSEN字节序(大字节序)写入

回读时,您肯定必须将 Big-Endianness 转换为机器的本地 endianness。

还有一个问题:sizeof (int)两台机器的if不一样。在那种情况下,事情会变得更加恶毒,我认为以上还不够。如果您确实需要在各种机器上便携,请考虑使用#include <stdint.h>例如定义的特定长度类型int32_t

于 2013-10-30T12:45:56.470 回答
0

请记住,我们生活在一个 4 维世界中。您说,保存的文件不会在 x、y 和 z 轴上移动,它将在同一台计算机上使用。但是你没有提到第四维度,时间。如果结构发生变化,它将失败。

至少,您应该在结构中放置一个签名字段。在 write() 之前用常量值填充它,在 read() 之后立即检查它,并在结构被修改时更改常量值。

于 2013-10-30T12:47:08.960 回答