如果真的想把这个结构体“导出”,建议还是用C的风格写吧~
字符串可以用固定的长度的char实现,这样就可以直接fread/fwrite读写啦。参考代码如下:
#include "stdio.h"
#include "string.h"
typedef struct {
char name[20]; // Name: 20Bytes char
int age; // Age: 4Bytes int
} Cat;
int main() {
// 导出
Cat *cat = (Cat *)malloc(sizeof(Cat));
strcpy(cat->name, "Mimi");
cat->age = 1;
FILE *fp = fopen("./out.cat", "wb+");
fwrite(cat, sizeof(Cat), 1, fp);
fclose(fp);
free(cat);
// 导入
cat = (Cat *)malloc(sizeof(Cat));
fp = fopen("./out.cat", "rb+");
fread(cat, sizeof(Cat), 1, fp);
fclose(fp);
printf("name:\t%s\n", cat->name);
printf("age:\t%d\n", cat->age);
free(cat);
return 0;
}
实际的运行结果与导出数据:

你可以发现,这个代码正常运行,导出的文件 out.cat
的 0x00~0x14 之间的是 name 对应的内容。至于为什么 0x05 以后的空间存在非0的数,这是因为导出前内存没有memset全部置0啦,不过不会影响字符串的读入(char[]的字符串靠 \0 判定末尾)。
作为对比,你可以看看不定长度的字符串的写法:
#include "stdio.h"
#include "string.h"
typedef struct {
char name[20]; // Name: 20Bytes char
int age; // Age: 4Bytes int
} Cat;
int main() {
// ## 导出
Cat *cat = (Cat *)malloc(sizeof(Cat));
strcpy(cat->name, "Mimi");
cat->age = 1;
FILE *fp = fopen("./out2.cat", "wb+");
// 先写出age
fwrite(&cat->age, sizeof(cat->age), 1, fp);
// 再计算 name 的长度 并写出
size_t name_len = strlen(cat->name) + 1;
fwrite(&name_len, sizeof(name_len), 1, fp);
// 最后写出 name 的数据
fwrite(cat->name, 1, name_len, fp);
fclose(fp);
free(cat);
// ## 导入
cat = (Cat *)malloc(sizeof(Cat));
fp = fopen("./out2.cat", "rb+");
// 按照导出规则,先导入age
fread(&cat->age, sizeof(cat->age), 1, fp);
// 再读取name字符串长度
fread(&name_len, sizeof(name_len), 1, fp);
// 最后读取 name_len 长的name字符串
fread(cat->name, 1, name_len, fp);
fclose(fp);
printf("name:\t%s\n", cat->name);
printf("age:\t%d\n", cat->age);
free(cat);
return 0;
}
运行与导出数据:

可以发现,的确是有节省到很多空间,不过这个代码写起来其实并不是很简洁啦。
所以如果真的在C/C++写个文件导入导出,最好还是基础类型OR定长的数组,不然可以考虑用JSON之类的格式哈哈。