首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C++读取文件

用C++读取文件
EN

Stack Overflow用户
提问于 2011-10-24 21:56:19
回答 2查看 236关注 0票数 0

我是C语言的新手,我面临的问题是我有一个解压的二进制文件(即它是某种格式的)。

我要做的就是把它打包,再解包一次,看看它是否与原始的解包版本相等。

值得一提的是:我被告知打包(即转换为已打包)和解包(即转换为未打包)功能工作得很好。我只想自己确认一下,并学习一点C语言...

我有两点认为我做错了

1:我读取文件的方式

2:我没有正确考虑压缩和解包的变量类型(即,对于压缩的,它是无符号字符*,对于非压缩的,它是短的*)

代码语言:javascript
复制
int main(void) {

FILE *fp;

unsigned char* packed ;
short* unpacked;
size_t result;
int fileSize;

fp = fopen(FILENAME, "rb");

fseek (fp , 0 , SEEK_END);
fileSize = ftell (fp);
rewind (fp);

unpacked = (short*) malloc (sizeof(char)*fileSize);

result = fread(unpacked,1,fileSize,fp);

short *originalUnpacked = unpacked;


convert_to_packed(&unpacked, &packed);

convert_to_unpacked(&unpacked, &packed);

if (originalUnpacked == unpacked)
{
    puts ("Thats it !!");

}

fclose(fp );
return EXIT_SUCCESS;
}
EN

回答 2

Stack Overflow用户

发布于 2011-10-24 21:59:33

这段代码是非常糟糕的。

当你应该比较内存时,你却在比较指针(originalUnpacked == unpacked)。为什么你要混合使用short *unsigned char *指针呢?如果数据是二进制"blob",那么您可能只应该使用后者。

要比较内存,请使用标准的memcmp()函数。

票数 3
EN

Stack Overflow用户

发布于 2011-10-24 22:18:00

你需要更好地理解什么是指针。把指针想象成你放在字母上的地址,把数据或者内存想象成房子。如果我复制一份地址,现在有两个字母,但只有一个房子,这两个字母都指的是同一所房子,我可以用其中任何一个到达房子。现在,复制房子需要做的工作比仅仅复制信件上的地址要多得多。你需要一座新房子和一封新地址的新信。

代码语言:javascript
复制
unpacked = (short*) malloc (sizeof(char)*fileSize);
  ^^                  ^^
the letter          building the house


short *originalUnpacked = unpacked;
         ^^                  ^^
       new letter         old letter = copying the letter (address) not the house!


if (originalUnpacked == unpacked)
        ^^                 ^^
    new letter          old letter - neither changed so are equal (same address)

您将这个地址提供给了转换函数convert_to_packedconvert_to_unpacked,这两个函数随后会覆盖原始数据,因为您忘记了建造新房子来保存原始数据。

要修复代码,您需要构建一个新的房子,并使用它来存储打包和解包的结果。然后,您需要比较两个房子的内容,而不是地址的字母。

代码语言:javascript
复制
 short newUnpacked = (short*) malloc (sizeof(char)*fileSize);

 convert_to_packed(&unpacked, &packed);
 convert_to_unpacked(&unpacked, &newUnpacked); // put unpacked data into new house!

 if (memcmp (unpacked, newUnpacked, filesize) == 0) // comparing contents of houses!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7876749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档