【问题标题】:reading structs in C?在 C 中读取结构?
【发布时间】:2014-02-12 20:03:28
【问题描述】:

所以我有一本结构书,

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

还有一个输入文件,其中包含 5 本书,内容类似,但实际文件为二进制形式:

content_size:64 价格:33

呸呸呸呸呸呸呸呸呸呸呸呸呸

content_size:16 价格:21

bbbbbbbbbbbbbbbb

content_size:16 价格:22

cccccccccccccccc

content_size:32 价格:10

dddddddddddddddddddddddddddddddddddddddddd

content_size:32 价格:8

eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

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

读一本书,大小为:64

读一本书,大小为:24929

读一本书,大小为:24929

读一本书,大小为:24929

读一本书,大小为:24929

读一本书,大小为:16

读一本书,大小为:25186

读一本书,大小为:16

读一本书,大小为:25443

读一本书,大小为:32

读一本书,大小为:25700

读一本书,大小为:25700

读一本书,大小为:32

读过一本书,大小为:25957

读过一本书,大小为:25957

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

【问题讨论】:

  • 在你的结构中,content 是一个指针。在文件中,它是一个字符串。您需要将字符串读入一个新的内存块,然后设置指针指向它。
  • 您必须逐个字段阅读。长度字段会告诉你有多大的缓冲区来 malloc 内容然后读取它。
  • 逐个字段是什么意思? @鸭子

标签: c file struct io fread


【解决方案1】:
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);
}

【讨论】:

  • 快速安全评论:我知道这是演示代码,但您信任 content_size 字段的长度。如果它设置为 0xffff,您只需 malloc'd 0 个字节,然后在内存的所有随机位上写入。最好验证所有外部数据,使用 if 将其限制为 1024 或某个合理值。
  • 查看写入文件的代码会有所帮助。我们需要知道字段在其二进制结构中的实际布局。
  • 嗯,非常感谢!我还看到您在阅读时将 book1.content 的大小指示为 1,这是拼写错误吗?
  • 不是,因为我设置了要读取的元素个数为book1.content_size
【解决方案2】:

我想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的值,因为你没有详细说明文件的组织方式我们无法回答(你提到文件是二进制格式的,但是是哪一种?)

【讨论】:

  • 看起来content_size是长度。
  • 如果我的结构中没有指针怎么办?那么我如何一次读取一个结构呢?
  • 如果没有指针,那么struct whatever {...};可以被struct whatever w; fread(&w,sizeof(w),1,file);安全读取
猜你喜欢
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多