Ошибка сегментации при чтении двоичного файла в структуру - PullRequest
1 голос
/ 24 марта 2012

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

Итак, есть эта структура, которая называется«hash_record», многие из них хранятся в моем файле «HASH_FILE» в двоичном режиме.Это структура:

typedef struct hash_record {
char *hash;
char *filename;
} hash_record;

Я пишу файл следующим образом:

hash_record hrec;
[...] code that fill the structure's fields [...]
FILE* hash_file = fopen(HASH_FILE, "ab");
fwrite(&hrec, sizeof(hash_record), 1, hash_file);
fclose(shared_file);

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

int print_data() {
hash_record rec;

printf("Data:\n");
FILE* hash_file = fopen("hash.bin", "rb");
if (hash_file == NULL)
    return -1;
while(fread(&rec, sizeof(hash_record), 1, hash_file) == 1)
    printf("Filename: %s - Hash: %s", rec.filename, rec.hash);
fclose(hash_file);
return 0;
}

И все работает просто отлично!Проблема заключается в том, что если я записываю двоичный файл в экземпляр моей программы и затем завершаю его, когда я снова открываю его (комментируя код, который записывает файл, чтобы он мог только читать его), это вызывает ошибку сегментации.Эта ошибка появляется, когда я вызываю printf () внутри цикла while ().Если я просто печатаю обычную строку без вызова «rec», ошибки не выдаются, поэтому я предполагаю, что что-то неправильно хранит данные внутри «rec».

Есть идеи?

Спасибо!

1 Ответ

4 голосов
/ 24 марта 2012

Вы пишете указатели. Когда вы читаете их обратно из одного и того же экземпляра программы, данные находятся в том же месте, и указатели имеют смысл. Если вы читаете их из другого экземпляра, указатели плохие.

...