背景:在项目中,我将设备的配置信息封装在一个结构体中,并用一个unsigned int的变量上的某些位标志来对应某些配置项,该结构体需要被保存在本地配置文件中,程序启动时需要加载配置文件上记录的该结构体的配置信息,若不存在则将该结构体默认配置信息写入文件。在程序运行期间,若用户改变了某些配置,标志变量对应的标志位被置1,程序在得知发生变化的标志量后就将对应的配置信息更新到配置文件中。
假设该结构体的原型如下:
typedef DevCfgInfo
{
int Addr;
char ConnectionStatus;
char LoadName[NAME_SIZE];
}DevCfgInfo;
程序运行期间,若用户改变了某个变量的值,将结构体中的某个配置项更新到配置文件对应的位置:
(1)计算该变量偏移了结构体开头n个字节;
(2)调用系统调用fseek()将文件指针定位到n个字节处理;
(3)调用fwrite()函数更新该变量信息。
其中在配置信息发生改变的变量具体结构体开头偏移的字节数计算方法如下:
#define NAME_SIZE 24
typedef struct
{
int Addr;
char ConnectionStatus;
char LoadName[NAME_SIZE];
}DevCfgInfo;
int main(void)
{
DevCfgInfo info = {
.Addr = 1,
.ConnectionStatus = 1,
.LoadName = "helloworld",
};
//printf("%d-%d-%s\n", info.Addr, info.ConnectionStatus, info.LoadName);
//将地址值强制转换为单字节的char型,相减后得到二者之间相差几个字节
printf("info.Addr offset %d Byte\n", (char*)&(info.Addr) - (char*)(&info));
printf("info.ConnectionStatus offset %d Byte\n", (char*)&(info.ConnectionStatus) - (char*)(&info));
printf("info.LoadName offs