【问题标题】:reading compressed file Gzread using struct c++使用struct c ++读取压缩文件Gzread
【发布时间】:2014-02-20 08:49:13
【问题描述】:

如何在c++中读取压缩结构格式的数据?

这是数据结构..

struct test
{
    unsigned int test3;
    unsigned char test1[4096];
    unsigned int test2;
} foo;

我们如何读取使用 gzread 写入文件的结构?

这是我尝试过的。

gzread(Handle,&foo.test3, sizeof(&foo.test3)); //64
gzread(Handle,&foo.test1, sizeof(&foo.test1)); //4096
gzread(Handle,&foo.test2,sizeof(&foo.test2)); //4

但是,我得到的数据是错误的。 我做错了什么?

如何读取以结构格式保存的文件的示例将帮助我做到这一点。

【问题讨论】:

  • 指针的大小将是指针的大小,而不是它所指向的大小。
  • 就我而言,这将是 64、4096 和 4。还有什么我做错了吗?
  • 好的。其余的看起来都不错,对吧?

标签: c++ data-structures gzip


【解决方案1】:

当您执行&foo.test1 时,您会得到一个指针,而当您在该指针上使用sizeof 时,您会得到指针的大小,而不是指针指向的内容。根据平台,这将是 4(对于 32 位平台)或 8(对于 64 位平台)。

要使代码正常工作,您应该放弃使用 & 操作数进行 sizeof 操作:

gzread(Handle, &foo.test3, sizeof(foo.test3));
gzread(Handle, &foo.test1, sizeof(foo.test1));
gzread(Handle, &foo.test2, sizeof(foo.test2));

但是,它可能仍然不正确!如果文件是用另一个命令写入的怎么办?或者如果完整的结构是一次性编写的,可能的填充和所有?您需要按原样阅读。

另外,你必须确保文件是以二进制模式打开的,否则你可能会得到奇怪的结果。

【讨论】:

  • 一口气写完完整的结构!
  • 你能举个例子吗?
  • @pistal 不,您已经知道如何调用gzread 函数。很明显你可以看到写结构的代码,你应该很容易弄清楚如何正确调用gzread
  • @pistal 看起来不错。而且您不必阅读单独的字段,单个 gzread 调用会读取 all 字段。
  • 那我如何访问这些字段?
猜你喜欢
  • 2013-11-16
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多