c - C语言用二进制文件保存和读取结构体数组

标签 c arrays struct

我的阅读功能存在一些问题。

我的阅读功能是:

int readFileToPic(FILE* f, pic* picture_Reccord, int picNumber){

 int count = 0;

 f = fopen("Record.dat", "rb");

 if (f == NULL){
    printf("\n Unable to open file!\n");
 }
 else{
    count= fread(&picture_Reccord, sizeof(picture_Reccord), Maximun_Picture,    f);
    fclose(f);
 }
 if (count <=0 && count >= Maximun_Picture)
    return -1;

  //breaking the programe
  //picture_Reccord[count].fileName[0] = '\n';

 return count;
  }

这就是我的称呼

case 3:
    printf("Read picture records from disk\n");
    count= readFileToPic(file, pictureRecord, picNumber);
    printf("\n\nRead %d photos\n", count);
    //testing
    printf("\n%d\n", pictureRecord[0].location);
    break;

它每次都会打印“Read 4 photos”并在测试部分进行抓取

这是我的保存功能,以防出现问题

void savePic(FILE* f, pic picture_Record){

f= fopen("Record.dat","wb");
if (f == NULL)
{
    printf("\nError! Not able to save!\n");
}

fwrite(&picture_Record, sizeof(picture_Record), 1, f);
fclose(f);

printf("One Pic Saved\n");

}

这是我更新的结构,感谢@Jonathan Leffler

typedef struct picture_Data
{
char fileName[Input_Length_fileName];
char description[Input_Length_description];
char location[Input_Length_fileName];
int peopleCount;
}pic;

有人可以帮助我并告诉我问题出在哪里吗?

最佳答案

当您的结构包含指针时,它无法合理地“序列化”。也就是说,它不能使用诸如 fwrite() 之类的任何函数来编写。

你问为什么不呢?好问题!

这样想:如果您有一个包含指向字符串(例如名称)的指针的结构,那么字符串中的数据通常与该结构不连续,并且当然不包括其大小结构尺寸。

相比之下,如果结构包含(固定大小)字符数组,则您可以编写整个结构,因为数据与结构的其余部分连续,并且计入数组的大小。

灵活数组成员需要稍微小心,但只要主结构记录灵活数组有多大,就可以将其写入磁盘。您可以在一次操作中写入,但需要两次读取。第一次读取读取结构中不灵活的部分;其中的数据项之一告诉您要分配多少空间以及要读取多少数据。

关于c - C语言用二进制文件保存和读取结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23719108/

相关文章:

c++ - 如何在 Arduino 中获得连续的 LED 闪光灯? [C/C++]

c++ - 某些 ATmega 2560 的第一个索引中的结构数组数据被重置

c - 使用 mmap 共享结构数组

c - ARM编程输出数组并malloc清除输入数组?

switch 语句中第一个 'case' 之前的代码

javascript - 通过mongodb文档的property进行映射

php - MySQL + PHP 中行之间的除法

java - 给定一个整数数组,查找并递增具有Java中总数组最低总和的重复值?

c++ - 在另一个文件中引用 C++ 结构对象?

c - 在 C 中减少十六进制格式以外的二进制数