【问题标题】:Saving a struct in C using Files使用文件在 C 中保存结构
【发布时间】:2014-12-27 14:33:28
【问题描述】:

我正在尝试用 C 语言编写一个程序来为我节省这种结构。首先,我的英语不是最好的,但我理解得很好。

主要问题是我不知道我会在哪里失败,因为我是新手,而且我确信我这样做有很多错误。我想稍后再读这个.bin,所以我不知道该怎么做,我会很感激一些帮助,谢谢:)

这是我的程序示例和我要保存的结构:

//HERE THE STRUCT//
typedef struct{
   char name[MAX_Nom_Impresora+1];
   int start,end;
} tExample;

int main ( int argc, char *argv[] ){

   ...
   tSave f[4];
   Save(f)
   ....

}    

//HERE THE FUNCTION TO SAVE THE STRUCT//

int Save (tExample f[]){
   FILE *pf;
   char *File="list.bin";
   int counter=0;
   int error=0;

   pf=fopen("File","a");
   if(pf==NULL)
      printf("\n Error.");
   else{
      fwrite(&f, sizeof(f),1, pf);
   }
   return error;
}

【问题讨论】:

  • 我认为应该是`fopen(File, "a")。除此之外,它看起来不错。
  • 查找序列化
  • sizeof(f) 不会返回指针的大小吗?最好将元素的数量添加到该函数调用中并在fwrite 中使用它和sizeof(tExample)
  • 另外,在从函数返回之前,您需要关闭文件。所以你需要打电话给fclose(pf)。随着调用fopen("FILE","a") 将打开一个名为 FILE 而不是 list.bin 的文件
  • 文件应该以二进制模式打开,所以应该是"ab",而不仅仅是"a"

标签: c file struct


【解决方案1】:

您似乎混淆了结构、指向结构的指针和结构数组。

我假设,你写了tSave f[4],但它应该是tExample f[4]。所以你尝试保存一个包含 4 个结构的数组。

第一个问题是,在C语言中,当你将数组作为参数传递给函数时,实际上传递的是数组的第一个元素的地址,而函数中没有意思得到数组的大小.因此,您应该将数组的大小与数组本身一起传递:

save(f, sizeof(f)/sizeof(tExample));

因为在声明数组的模块中,编译器知道大小并且可以计算元素的数量,这在函数save中是不可能的。

接下来,当您将tExample[] 传递给函数save 时,您在函数中得到的是一个地址。所以 sizeof(f) 实际上是 sizeof(tExample*) :指针的大小。你的代码应该是:

int Save (tExample f[], int nelts){
   FILE *pf;
   char *File="list.bin";
   int counter=0;
   int error=0;

   pf=fopen("File","a");
   if(pf==NULL)
      printf("\n Error.");
   else{
      fwrite(f, sizeof(tExample),nelts, pf);
   }
   return error;
}

注意:

  • f 之前没有 &,因为 f 实际上是一个地址(数组衰减为一个指针)
  • 明确使用结构的大小
  • 明确使用传递给函数的元素数量

【讨论】:

    【解决方案2】:

    这是一个 Posix 版本,如果您将 openclosereadwrite 替换为带有 f 前缀的版本并在 FILE * 流而不是文件描述符上运行,则可以适应 ansi。

    static int get_value(const char *path, void *buf,size_t len){ 
       int fd = open(path, O_RDONLY); 
       if (fd<0) return fd; 
       len=read(fd,buf,len); 
       close(fd); 
       return len; 
    } 
    static int set_value(const char *path, void *buf,size_t len){ 
       int fd = open(path, O_CREAT|O_WRONLY|O_TRUNC,0644); 
       if (fd<0) return fd; 
       len=write(fd,buf,len); 
       close(fd); 
       return len; 
    } 
    

    用法:

    • set_value("/path/to/my/struct_file",&amp;my_struct,sizeof(my_struct));
    • get_value("/path/to/my/struct_file",&amp;my_struct,sizeof(my_struct));

    【讨论】:

      【解决方案3】:

      改变

      大小(f)

      sizeof(f) * sizeof(tExample)

      另外,记得在程序结束前关闭文件。

      【讨论】:

      • @Jongware 你说得对,我做了一个测试,编译器实际上抱怨:“警告:数组函数参数上的 sizeof 将返回 'int *' 而不是 'int []' 的大小”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多