Я искал и искал в Интернете помощь по эффективному использованию fseek(), но независимо от того, что я делаю, я все еще не получаю правильных результатов. В основном я читаю из файла животных, у которых есть параметр «возраст». Если возраст равен -1, то после добавления в этот двоичный файл я должен использовать fseek(), чтобы найти первую -1 в файле и перезаписать всю эту строку новой информацией, которую вводит пользователь. У меня есть массив, который проходит и находит все дыры в начале файла, и он работает правильно. Моя проблема в том, что он обновляет новое животное и помещает каждое в следующий пустой слот с возрастом -1, но когда я иду обновлять свой файл, все животные добавляются в конец, даже если их идентификаторы являются идентификаторами когда-то пустых слотов. Вот мой код:
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];
}
}
В самом начале файла есть целое число, которое сообщает нам количество отверстий в файле, поэтому смещение удаляет это, поэтому, как только я его печатаю, он печатает все правильно. Затем я проверяю, есть ли дыры в созданном мной вспомогательном массиве, если они есть, то я хочу, чтобы идентификатор животного был этим идентификатором, и я пытаюсь найти строку с первым -1 возрастом, чтобы поместить туда обновленную информацию о моем животном. , а затем записать его в файл. В последнем цикле for я просто перемещаю доступные отверстия. Да, и что касается открытия файла, я использую r+b для чтения и записи. Заранее спасибо!
fopen()
? Похоже, что файл был открыт в режиме добавления. - person fuz   schedule 13.12.2015ani.id -1
быть в скобках? - person Johnny Mopp   schedule 13.12.2015int offset = ((sizeof(int) + sizeof(ani)) * ani.id -1);
должна быть:int offset = ((sizeof(int) + sizeof(ani)) * (ani.id -1));
- person user3629249   schedule 14.12.2015