我正在使用Linux平台上的libX11
和libpthread
在C中设计一个小游戏,所有级别信息都填充到结构数组Level[Level_Amount]
中。
struct Pos
{
int X;
int Y;
};
struct Pos_Info
{
int Flag;
int Drctn;
int Layer;
struct Pos Postn;
int Color;
};
struct In_Out_Chnl
{
struct Pos Drctn[Channel_Amount];
};
struct Check_Point
{
int Remain;
struct Pos Postn[Chk_Pnt_Amount];
};
struct Level_Info
{
char Map[Rbn_Col][Rbn_Row];
struct Pos_Info Draw, Rcvd;
struct Check_Point Chk_Pnt;
struct In_Out_Chnl Channel;
};
struct Level_Info Level[Level_Amount];
我很困惑它是否是从文件中读取和编写struct数组的好方法,如下所示:
FILE *fp;
fwrite(&Level, sizeof(struct Level_Info), Level_Amount, fp);
fread (&Level, sizeof(struct Level_Info), Level_Amount, fp);
结构(具有不同类型的元素)的内存分配是否会与编译器或CPU不同?
有没有更好的方法来保存和阅读整个结构安全?
答案 0 :(得分:0)
您可以按照建议的方式进行操作,但请记住,您需要坚持使用结构布局。这意味着
关于int问题,您可以包含stdint.h
并使用类似int32_t
的类型。对于字节顺序,您可以按网络字节顺序保存文件中的数据,然后使用套接字转换函数ntohs
和ntohl
进行字节顺序转换。
始终牢记:如果你从一个文件中读取,你正在处理外部输入,那么请准备好输入是完全垃圾(攻击者可能已经改变了它)。
您可能还希望Google使用术语serialization
作为流程或将数据从内存写入持久存储并再次检索它。
答案 1 :(得分:0)
你可以这样做,但要注意以下几点:
在不同的优化级别(或编译器)下,结构将以不同的方式表示或打包。您应该使用结构打包内在函数来处理这个问题。看这里: http://msdn.microsoft.com/en-us/library/2e70t5y1.aspx https://gcc.gnu.org/onlinedocs/gcc/Structure-Packing-Pragmas.html
您的结构不能包含指针内的成员。如果它们这样做,则指针必须是相对于存储器的相对偏移,该存储器保持在内部即竞技场中。这样做的原因是当你从文件中fread
回来时,一切都将在内存中完全不同的位置,因此指针将无效。
此外,我建议您使用内存映射 - 它不仅可以提供更高的性能,而且通过一些特定于操作系统的代码,您可以教它在您的结构变大时自动扩展文件;