首页 > 解决方案 > 在文件中保存带有指针成员的结构

问题描述

我正在尝试将结构保存到 .dat 文件中,稍后再读回。

struct myStruct{
  char **one;
  mytype **two;
  mytype2 *three;
}

使用分配功能:

struct MyStruct get_struct() = {
char **pi = ...;
mytype **pa = ...;
mytype2 **po = ...;
MyStruct n = {pi, pa, po};
return n;
}

我最初尝试通过执行以下操作将此结构保存到 .dat 文件中:

struct MyStruct s = get_struct();
myoutfile = fopen("file.dat", "w");
if (myoutfile == NULL) {
    fprintf(stderr, "\nError opend file\n");
    exit(1);
}
fwrite(&s, sizeof(struct MyStruct), 1, myoutfile);
fclose(myoutfile);

并将其读回:

fread(&t, sizeof(struct MyStruct), 1, myinfile)

现在我了解到,这不起作用(分段错误),因为我只保存指针指向的位置,而不是实际的东西。

现在我的问题是,我怎样才能正确地做到这一点?我找到了一些 C++ 的解决方案,但我需要留在 C 中。

编辑: 稍后,我想调用一个如下所示的函数:

void work_with_struct(MyStruct s){
   char ** xone = s.one;
   mytype **xtwo = s.two;
   mytype2 *xthree = s.three;
}

这篇文章与这篇文章有关,但正如我现在可以指出我的错误一样,在新帖子中提问对我来说更有意义。

标签: cpointersstruct

解决方案


与编程一样,您将任务分解为更小的块,并将更小的块分解为更小的块,直到每个块都很容易。

int saveMyStruct (struct myStruct* myStruct, FILE* file) {
   // what do I do here?!?!
   // well it has three members
   // so treat each one in sequence
   int result;
   result = saveStringArray(myStruct->one, file);
   if (result >= 0)
     result = saveMyTypeArray (myStruct->two, file);
   if (result >= 0)
     result = saveMyType (myStruct->three, file);
   return result;
}

请注意如何始终检查状态。如果您使用文件,则需要始终检查状态。

接下来是什么?您需要编写上面提到的三个函数。

 saveStringArray(char** stringArray, FILE* file)
 {
     // first save the length of the array, then save each individual string
     int length = getStringArrayLength(stringArray);
     int result = fwrite(&length, sizeof(length), 1, file);
     if (result != 1)
        return -1;
     for (i = 0; i < length; ++i)
     {
        result = saveString(stringArray[i], file);
        if (result < 0)
           return -1;
     }
     return i;            
 }

等等等等。我认为你的指针数组是以 NULL 结尾的;如果没有,你需要有一些其他的方法来知道它的长度。

请注意数组长度始终保存在数组元素之前。这是因为您稍后需要读取您的数组,并且您需要知道在哪里停止。读取数组时也很容易分配数组。


推荐阅读