如何在结构中的c ---- struct中创建二进制文件

时间:2014-05-15 13:53:05

标签: c binaryfiles

如果我有一个如下所示的链接列表,我如何制作二进制文件:

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;
};

1 个答案:

答案 0 :(得分:3)

如果你的结构是无指针的,你可以使用fwrite调用并传入指向结构的指针。但是,由于您的结构包含指针,因此您需要包含用于读取和写入数据的特殊处理。

您可能希望编写一个覆盖每个jor的函数,写出int的{​​{1}}和char[],计算材料数量,写入此内容编号,然后写入每种材料的数据(jorfloat)。您可以考虑一些其他方法,其中您没有写出材料和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);
}