【问题标题】:C: Saving dynamic array of structs along with stringC:将结构的动态数组与字符串一起保存
【发布时间】:2018-12-18 15:50:39
【问题描述】:

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

typedef struct tupleStruct{

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

}tuple_t;

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

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

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();

【问题讨论】:

  • 最简单的方法,如果你可以给字符串一个固定的最大大小,比如你的例子中的 256。
  • @Lundin 我试过了,但即使在那种情况下,它仍然被视为指针。
  • c 中确实存在字符串 .. 不完全确定您在问什么。您可以使用fprintf 将字符串写入文件。除了第一个参数是 FILE*
  • 向我们展示您正在编写输出的代码,我们可以看到您哪里出错了。
  • 这是将字符串(您的char *)写入文件的一种方法示例:stackoverflow.com/questions/4182876/…。之后,您仍然需要编写element 数组和eCount。您是否也应该写出element 的大小以便可以恢复,还是可以从数据中推断出固定的/可以推断的?您还需要从DynamicArray 写入usedsize。您需要以特定方式编写所有内容,以便读者了解格式并准确恢复所有数据。

标签: c arrays dynamic struct


【解决方案1】:

不要一口气写出整个结构,而是利用你对它们所包含内容的了解来写出它的各个部分。例如,如果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...

【讨论】:

    【解决方案2】:

    它将来可能对谁有所帮助:所以在询问了一下之后,有些人通过将标识符视为数组而不是指针来使其工作。

    char id[256];
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 2022-07-01
      • 1970-01-01
      • 2013-05-11
      • 2021-04-18
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      相关资源
      最近更新 更多