如果我有一个如下所示的链接列表,我如何制作二进制文件:
typedef struct jor JOR;
typedef struct materials MATERIALS;
struct jor {
int Number;
char Date[20];
MATERIALS *m;
struct jor *next;
};
struct materials{
float Qty;
char Unit[20];
struct materials *next;
};
答案 0 :(得分:3)
如果你的结构是无指针的,你可以使用fwrite
调用并传入指向结构的指针。但是,由于您的结构包含指针,因此您需要包含用于读取和写入数据的特殊处理。
您可能希望编写一个覆盖每个jor
的函数,写出int
的{{1}}和char[]
,计算材料数量,写入此内容编号,然后写入每种材料的数据(jor
和float
)。您可以考虑一些其他方法,其中您没有写出材料和char[]
条目的数量,但是编写数字可能要简单得多。
未经测试,但您可能会执行类似操作(我假设链接列表以NULL指针终止):
jor
然后阅读你会做类似的事情:
void WriteData(char[] szFilename, JOR* first)
{
// Open binary file for writing (TODO: check successfully opened)
FILE* fp = fopen(szFilename, "wb");
// Count the number of `JOR`
int i = 0; for (JOR* j = first; j != NULL; j = j->next;) i++;
// Write the count to file
fwrite(&i, sizeof(int), 1, fp);
for (JOR* j = first; j != NULL; j = j->next)
{
// Write contents of `JOR`
fwrite(j, sizeof(int) + sizeof(char)*20, 1, fp);
// Count the number of `MATERIAL`
int k = 0; for (MATERIAL* m = j->m; m != NULL; m = m->next) k++;
// Write the materials to file
fwrite(&k, sizeof(int), 1, fp);
for (MATERIAL* m = j->m; m != NULL; m = m->next)
{
// Write contents of material
fwrite(m, sizeof(float) + sizeof(char)*20, 1, fp);
}
}
fclose(fp);
}