Как индикатор положения связывается с указателем файла после вызова fseek, fwrite и fread - PullRequest
0 голосов
/ 15 апреля 2020

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

...