【问题标题】:Array of struct from binary file来自二进制文件的结构数组
【发布时间】:2015-08-29 11:29:20
【问题描述】:

我必须编写一个函数,该函数将使用二进制文件中的数据读取 Product 类型的结构数组。该文件包含产品数量 - nr 和一些 Product 类型的文章。怎么了?提前谢谢!

#define SIZE 30

typedef struc{
    int id;
    char[SIZE] name;
    float price;
}Product;

void create(Product *p, FILE *fptr)
{
    p = malloc(sizeof(Product));
    fread(p, 1, sizeof(Product), fptr);
}

int main(int argc, char* argv[])
{
    FILE *fptr = fopen(argv[1],"rb");
    Product *p;
    create(p, fptr);

    return 0;
}

【问题讨论】:

  • 仅当数据保存为fwrite(p, 1, sizeof(Product), fptr); 时才有效。文件是如何创建的?
  • 如果您希望看到pmain() 中具有任何确定性,那么根本就不会工作。在create 中分配给pmain() 中的p 没有任何意义。你的代码在哪里尝试读取幅度,然后是数组?这只会读取 一个 结构,然后泄漏它。

标签: c arrays structure binaryfiles


【解决方案1】:

你必须把它修改成这样:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 30

typedef struct{
    int id;
    char name[SIZE];
    float price;
}Product;

int readproducts(Product *p, FILE *fptr, int nr)
{    
    if(nr != fread(p, sizeof(Product), nr, fptr))
      return -1;

    return 0;
}

int main(int argc, char* argv[])
{
    FILE *fptr = fopen(argv[1],"rb");
    int nr = 0;
    if(NULL == fptr) return -1;
        
    // First read number of products from file
    // Assuming this number is written as 4 byte integer - at the start of file
    if(fread(&nr, 4, 1, fptr) != 1)
       return -1;

    // Now, read the products
    Product *p = malloc(nr * sizeof(Product));
    if(-1 == readproducts(p, fptr, nr))
     return -1;
 
    fclose(fptr);
    return 0;
}

你在函数中使用 malloc 的方式是错误的,见here为什么。

PS。也就是说,二进制写入/读取可能无法在不同的计算机之间移植。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2011-06-04
    相关资源
    最近更新 更多