Прежде чем пытаться записать данные в файл или прочитать данные из файла, вы должны выписать спецификацию для формата, который будут иметь данные в файле.То, что вы делаете, это записывает произвольные байты данных в неизвестном формате в файл.Если это на самом деле работает, то это просто удача.
Если вы хотите сохранить, скажем, целое число, в файле, вам нужно решить, будете ли вы использовать фиксированную или переменную длину.Если переменная, как читатель определит, сколько байтов он занимает?Будут ли наиболее значимые цифры / биты первыми или наименее значимыми?Вы напишите это в текстовом или двоичном виде?
Затем вам нужно написать код для преобразования ваших данных в байты, которые должен иметь файл.И когда вы читаете их обратно, вам нужно преобразовать их в типы, которые ваша программа хочет использовать для манипулирования ими.
Если у вас нет опыта, строки текста, вероятно, лучше.Таким образом, вы также можете легко просмотреть файл в средстве просмотра или редакторе, чтобы понять его.
Вы не можете сделать это:
fwrite(ptr,sizeof(struct book),1,bookFilePtr);
Вы просто пишете произвольные байты вфайл.Да, они имеют смысл в вашем текущем контексте выполнения, но они могут иметь или не иметь смысл в другом контексте выполнения.Вам необходимо преобразовать их в четко определенный, автономный формат данных, подходящий для записи в файл.
Вот глупый пример:
const char *foo="foo";
fwrite(&foo, sizeof(&foo), 1, filePtr);
Это запишет содержимоеfoo
, который является указателем на строку со значением "foo"
.Но когда вы читаете это обратно, вы читаете назад указатель на адресное пространство, которое больше даже не существует.Какой смысл в этом?Скорее всего, это не будет указывать на что-то значимое в вашем адресном пространстве.