我在一小段代码上遇到了麻烦,我正在尝试读取一个二进制文件,如果我将此代码放在单独的文件上,构建并运行它,它会完美地读取该文件,但如果我输入相同的代码在函数内的较大项目中,它总是错误地读取数据(两次测试使用同一文件)。
这是单独项目上的代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
char* filename = (char*)"file.binary";
FILE* file = fopen(filename, "rb");
if (!file) {
printf("Unable to open %s for reading. \n", filename);
fclose(file);
free(filename);
exit(1);
}
fseek (file , 0 , SEEK_END);
long size = ftell (file);
rewind (file);
printf("Number of bytes in the file is %ld \n", size);
int version = 0;
char* string = (char*)malloc(sizeof(char) * 3);
fread(string, sizeof(char), 3, file);
if (strcmp(string, (char*)"str")) {
printf("%s is not properly formatted. \n", filename);
fclose(file);
free(filename);
exit(1);
}
fread(&version, sizeof(int), 1, file);
printf("%s version %d\n", string, version);
free(filename);
fclose(file);
}
Run Code Online (Sandbox Code Playgroud)
我不会在更大的项目上发布代码,因为它完全相同(复制粘贴),除了因为它进入类函数内部而不是直接在主函数上。这是一段非常简单的代码,但由于某种奇怪的原因它失败了,我无法理解它。对于这两种情况,文件大小都被正确读取,单独的项目正确读取“字符串”和“版本”数据并正确打印它,但是在较大的项目中,它总是进入第二个条件,因为字符串不是预计会是什么。
我不认为这是相关的,但是更大的项目正在构建到一个静态库中,该库稍后用于与主程序进行链接。
有人知道我可能失踪了吗?谢谢。
char* string = (char*)malloc(sizeof(char) * 3);
fread(string, sizeof(char), 3, file);
if (strcmp(string, (char*)"str")) {
}
Run Code Online (Sandbox Code Playgroud)
您为三个字符分配内存,但与四个字符进行比较:“str”和空字节。您应该分配四个字节并将最后一个字节设置为零(或简单地使用calloc
)。我可以想象第四个字节在独立应用程序中确实碰巧为零,但在较大的项目中则不然。