Я посмотрел и посмотрел онлайн о помощи по эффективному использованию fseek(), но независимо от того, что я делаю, я все равно не получаю нужных результатов. В основном я читаю из файла животных, у которого есть параметр «возраст». Если возраст равен -1, то при добавлении к этому двоичному файлу я должен использовать fseek(), чтобы найти первый -1 в файле и переписать всю строку с новой информацией, которую вводит пользователь. У меня есть массив, который перемещается и находит все отверстия в начале файла, и он работает правильно. Моя проблема заключается в том, что он обновляет новое животное и помещает каждого в следующий пустой слот с возрастом -1, но когда я иду обновлять свой файл, все животные добавляются до конца, хотя их идентификаторы являются идентификаторами из когда-то пустых слотов. Вот мой код:Использование fseek() Чтобы обновить двоичный файл
void addingAnimal(FILE *file, struct animal ani, int * availableHoles) {
int i;
int offset = ((sizeof(int) + sizeof(ani)) * ani.id -1);
if (availableHoles[0] != 0) {
fseek(file, offset, SEEK_SET);
ani.id = availableHoles[0];
fwrite & ani, sizeof(ani), 1, file);
for (i = 0; i < sizeof(availableHoles) -1; i++) {
availableHoles[i] = avialablesHoles[i+1];
}
}
В самом начале файла есть целое число, которое говорит нам количество отверстий в файл, так что смещение является удалением, что, так как только я печатаю, он печатает все правильно. Затем я проверяю, есть ли дырки в вспомогательном массиве, который я создал, если есть, то я хочу, чтобы идентификатор животного был этим id, и я пытаюсь найти линию с первым -1 возрастом, чтобы разместить информацию обновленного животного там , а затем записывая его в файл. Последний цикл for-loop - это просто переключение доступных отверстий. О, и для открытия файла я использую r + b для чтения и записи. Заранее спасибо!
Как вы открыли файл? Какие аргументы вы перешли к 'fopen()'? Кажется, файл был открыт в режиме добавления. – fuz
Я сказал в следующем последнем предложении, что я использовал «r + b», который я прочитал, является наиболее подходящим способом для открытия при изменении файла так, как я предполагаю. – user3376654
Хорошо, не могли бы вы сделать [mcve]? – fuz