文件在C中读取

时间:2011-10-24 13:56:19

标签: c file-io

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

我想要做的是打包并重新打开它,看看它是否与原始的解压缩版本相同。

值得一提的是:我被告知打包(即转换为打包)和解包(即转换为解压缩)功能运行良好..只是想为自己确认并学习一点C ... < / p>

我认为我犯了两个错误

1:我正在阅读文件的方式

2:我没有正确考虑打包和解包的变量类型(即打包时它是unsigned char *,而unpacked则是short *)

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;
}

2 个答案:

答案 0 :(得分:3)

此代码非常破碎。

您应该在比较内存时比较指针(originalUnpacked == unpacked)。为什么要混合short *unsigned char *指针?如果数据是二进制“blob”,则应该只使用后者。

要比较内存,请使用标准memcmp()功能。

答案 1 :(得分:0)

您需要更好地了解指针是什么。可以将指针视为您放在字母上的地址,将数据或内存视为房子。如果我复制一份地址,现在有两个字母,但只有一个房子,两个字母都指的是同一个房子,我可以用它们来到房子里。现在,复制房子需要更多的工作,而不仅仅是复制信件上的地址。你需要一所新房子和一封带有新地址的新信件。

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,然后覆盖原始数据,因为您忘记构建新房子以保留原始数据。

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

 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!