读C中的结构?

时间:2014-02-12 20:03:29

标签: c file struct io fread

所以我有一本结构书,

struct book
{
  unsigned short  content_size;
  unsigned short  price;
  unsigned char  *content;
};

一个包含5本书的输入文件,其中包含这样的内容,但实际文件中包含二进制格式:

  

content_size:64价格:33

     

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

     

content_size:16价格:21

     

bbbbbbbbbbbbbbbb

     

content_size:16价格:22

     

cccccccccccccccc

     

content_size:32价格:10

     

dddddddddddddddddddddddddddddddd

     

content_size:32价格:8

     

eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

但是,我得到了以下输出:

  读一本书,大小是:64

     

读一本书,大小是:24929

     

读一本书,大小是:24929

     

读一本书,大小是:24929

     

读一本书,大小是:24929

     读一本书,大小是:16

     读一本书,大小是:25186

     读一本书,大小是:16

     读一本书,大小是:25443

     读一本书,大小是:32

     读一本书,大小是:25700

     读一本书,大小是:25700

     读一本书,大小是:32

     读一本书,大小是:25957

     读一本书,大小是:25957

那些大数字是什么?我为什么要阅读它们?谢谢!

2 个答案:

答案 0 :(得分:2)

size_t nread;
struct book book1;

while ((nread = fread(&book1.content_size, sizeof book1.content_size, 1, infp)) > 0) {
    fread(&book1.price, sizeof book1.price, 1, infp);
    book1.content = malloc(book1.content_size+1);
    fread(book1.content, 1, book1.content_size, infp);
    book1.content[book1.content_size] = '\0';
    printf("read a book, size is %d, price is %d, content is %s\n", book1.content_size, book1.price, book1.content);
    free(book1.content);
}

答案 1 :(得分:0)

我认为struct packetstruct book我错了吗?我不是你的代码有问题。该结构包含一个char *指针,您无法从文件中读取指针而没有问题。我怀疑你想阅读'b'的'a'序列,并从那个读数中得到char *。但你不能这样做。你应该读这样的“字符串”:

char t[MAX];
l=fread(t,sizeof(char),length,yourfilehandler)
yourBook->content = malloc(l+1);
memcpy(yourBook->content,t,l);
yourBook->content[l] = '\0';

问题是要确定length的值,因为你没有详细说明文件是如何组织的我们无法回答(你提到文件是二进制格式,但是哪一个?)