Я работаю над программой, которая управляет регистрами в файле и сталкивается с очень странной проблемой. При удалении записей я делаю обратный список доступных слотов в удаленных записях, чтобы освободить место при добавлении новых записей. Поэтому, когда я удаляю запись, я помещаю специальный символ ('*'), чтобы указать, что она удалена, и пишу -1 после этого, чтобы указать, что это последний доступный слот. Затем я go возвращаюсь к предыдущему последнему слоту и изменяю его -1 на смещение вновь удаленной записи. Вот мой код для этого:
char deleted = '*';
long lastSlot = rh->slotList[rh->slotCount -2];
long newLastSlot = rh->slotList[rh->slotCount -1];
fseek(rh->file, lastSlot, SEEK_SET);
fwrite(&deleted, 1, sizeof(char), rh->file);
fwrite(&newLastSlot, 1, sizeof(long), rh->file);
Это прекрасно работает, но странная проблема заключается в том, что раньше я это делал:
char deleted;
long lastSlot = rh->slotList[rh->slotCount -2];
long newLastSlot = rh->slotList[rh->slotCount -1];
fseek(rh->file, lastSlot, SEEK_SET);
fread(&deleted, 1, sizeof(char), rh->file);
fwrite(&newLastSlot, 1, sizeof(long), rh->file);
И это НЕ работает. Я не уверен, что именно происходит, но когда я пытаюсь снова прочитать эту запись, она по-прежнему имеет значение -1 вместо значения в newLastSlot.
При работе в отладчике я вижу, что удаленные правильно читаются в ' * 'и newLastSlot также имеют правое смещение, но почему-то оно не записывается должным образом после вызова fwrite.
Может кто-нибудь объяснить мне, почему это происходит? Использует ли fread и fwrite другой индикатор положения или что-то подобное? Кстати, я открываю файл с помощью «rb +» и использую clang