C:将动态结构数组与字符串一起保存

时间:2018-12-18 15:50:39

标签: c arrays dynamic struct

我正在尝试保存一个结构(列出)

typedef struct tupleStruct{

    int element[eMax];
    char * id;
    int eCount;

}tuple_t;

typedef struct {
    tuple_t * array;
    int used;
    int size;
} DynamicArray;

作为作业的一部分,我被要求将存储在动态数组中的元组保存在文件中。不幸的是,因为字符串在c中不存在(至少不像其他语言中那样)。每当我尝试将动态数组的元素保存在文件中时,该字符串就不会被正确存储或加载,因为它被视为指针。我什至尝试过在struct中像这样初始化它:

char id[256];

是否可以将结构和字符串保存在单个文件中? (鉴于我需要存储多个)

编辑:保存和加载代码

加载

DynamicArray loadAllTuples(){

    FILE *filePointer;

    DynamicArray tempArray;

    if((filePointer=fopen("SavedTuples.bin","rb"))==NULL)
    {
        fputs("Something went wrong while loading!\nA blank Array will be loaded instead\n", stderr);
        setbuf(stdout, 0);

        //In case of error, blank array is initalised and loaded
        fclose(filePointer);

        intialiseDynamicArray(&tempArray);

        return tempArray;
    }



    fread(&tempArray, sizeof(DynamicArray),1,filePointer);

    //Freeing filePointer memory
    free(filePointer);

    return tempArray;

}

保存

void saveAllTuples(DynamicArray ToSave){

    trimArray(&ToSave,0); //Removing extra space from array

    FILE * filePointer;

    if((filePointer=fopen("SavedTuples.bin","wb"))==NULL)
    {
        fputs("Something went wrong while saving!\n", stderr);
        setbuf(stdout, 0);
        return;
    }

    fwrite(&ToSave, sizeof(ToSave), 1,filePointer);
    fclose(filePointer);

}

呼叫
saveAllTuples(dynaArray);

dynaArray=loadAllTuples();

2 个答案:

答案 0 :(得分:2)

与其一口气写出整个结构,反而利用您对结构所包含内容的了解来写出它的各个部分。因此,例如,如果eCountelement中的值量,则可以这样写

fwrite(&ToSave.eCount,sizeof(int), 1, filepointer);
fwrite(ToSave.element,sizeof(int), ToSave.eCount, filepointer);

然后存储字符串部分

size_t length=strlen(ToSave.id);
fwrite(&length,sizeof(int), 1, filepointer);
fwrite(ToSave.id,sizeof(char), length, filepointer);

注意:sizeof(char)通常始终为1,因此您可以假设并放置1而不是sizeof(char),但是我发现它使代码看起来更统一。

然后您在阅读时就颠倒了过程

fwrite(&ToLoad.eCount,sizeof(int), 1, filepointer);
fwrite(ToLoad.element,sizeof(int), ToLoad.eCount, filepointer);
// etc...

答案 1 :(得分:0)

将来可能对谁有帮助:因此,经过一番询问后,有些人通过将标识符视为数组而不是指针来使它起作用。

char id[256];

我说过以前这没用,但这可能是由于我没有发现的另一个错误。只要使用数组,保存每个元组将使字符串标识符保持不变。