2012-03-24 3 views
1

У меня возникают некоторые проблемы при попытке прочитать двоичный файл в 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() функция внутри цикла, так что я могу заполнить файл многие hash_record's. Затем, сразу после этого фрагмента кода, я начинаю читать файл и печатать некоторые данные, чтобы убедиться, что все прошло хорошо. Это код:

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

Любая идея?

Спасибо!

+3

Вы не можете сериализовать 'char *', по крайней мере, не так, как вы думаете. Вам нужно сделать сериализацию должным образом, что выходит за рамки комментария. –

+0

Я предполагаю, что вызов 'fread' не хранит ничего в' rec', поэтому printf терпит неудачу. Используйте отладчик, чтобы убедиться, что 'rec' не является нулевым. – prelic

+2

Нам понадобится дополнительная информация, которая вам поможет. Некоторые особенности структуры данных, которые вы пишете. В частности, содержит ли структура адреса? Если это так, адрес в программе записи не имеет отношения к программе чтения; вы должны восстановить адрес. Однако то, что вы показываете, не говорит нам, в чем проблема. –

ответ

4

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

+0

Я бы пошел на это. Если вы хотите сохранить строки, вам придется сбрасывать их в файл самостоятельно. – Guido

+0

Спасибо! Вы правы, проблема была в самой структуре. Я использовал указатели для хранения строк, и я не думал об этом при написании всего файла. – Jack

Смежные вопросы