奇怪的行为:不同位置的相同代码,一个读取二进制文件失败

时间:2011-08-13 20:56:11

标签: c file binary

我遇到一小段代码时出现问题,我正在尝试读取二进制文件,如果我将此代码放在单独的文件上,构建并运行它,它会完美地读取文件,但是如果我放入在函数中较大项目上的相同代码,它总是错误地读取数据(对于2个测试是相同的文件)。

这是单独项目的代码:

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

我不是在较大的项目上发布代码,因为它完全相同(复制粘贴),因为它进入类函数而不是直接在main函数上。这是一段相当简单的代码,但由于一些奇怪的原因,它失败了,我无法理解它。正确读取两种情况下的文件大小,单独的项目正确读取“字符串”和“版本”数据并正确打印,但是在较大的项目中它总是进入第二个条件,因为字符串不是预计会是什么。

我认为它不相关,但较大的项目正在构建一个静态库,后来用于链接主程序。

有没有人知道我可能会失踪?感谢。

1 个答案:

答案 0 :(得分:4)

char* string = (char*)malloc(sizeof(char) * 3);
fread(string, sizeof(char), 3, file);
if (strcmp(string, (char*)"str")) {
}

您为三个字符分配内存,但是与四个字符进行比较:“str”和空字节。您应该分配四个字节并将最后一个设置为零(或者只使用calloc)。我可以想象第四个字节在独立应用程序中确实恰好为零,但不在更大的项目中。