Странное поведение: один и тот же код в разных местах, один не читает двоичный файл - PullRequest
2 голосов
/ 14 августа 2011

У меня проблемы с небольшим фрагментом кода, я пытаюсь прочитать бинарный файл, если у меня есть этот код в отдельном файле, создайте и запустите его, он отлично читает файл, но если я поставлюодин и тот же код в большем проекте в функции, он всегда читает данные неправильно (будучи одним и тем же файлом для двух тестов).

Это код в отдельном проекте:

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

Я не публикую код в более крупном проекте, потому что он точно такой же (копия вставлена), за исключением того, что он находится внутриФункция класса вместо непосредственно на главной функции.Это довольно простой кусок кода, но по какой-то странной причине он терпит неудачу, и я не могу разобраться с этим.В обоих случаях правильно читается размер файла, отдельный проект правильно считывает данные «строка» и «версия» и правильно их печатает, однако в более крупном проекте он всегда попадает во второе условие, поскольку строка нечто, как ожидается, будет.

Я не думаю, что это связано, но более крупный проект встраивается в статическую библиотеку, которая позднее используется для связи с основной программой.

У кого-нибудь есть подсказка, могу ли я пропустить?Благодаря.

1 Ответ

4 голосов
/ 14 августа 2011
char* string = (char*)malloc(sizeof(char) * 3);
fread(string, sizeof(char), 3, file);
if (strcmp(string, (char*)"str")) {
}

Вы выделяете память для трех символов, но сравниваете их с четырьмя: "str" ​​и нулевой байт.Вы должны выделить четыре байта и установить последний в ноль (или просто использовать calloc).Я мог бы представить, что четвертый байт действительно равен нулю в автономном приложении, но не в более крупном проекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...