2015-12-13 10 views
0

Я посмотрел и посмотрел онлайн о помощи по эффективному использованию 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 для чтения и записи. Заранее спасибо!

+0

Как вы открыли файл? Какие аргументы вы перешли к 'fopen()'? Кажется, файл был открыт в режиме добавления. – fuz

+0

Я сказал в следующем последнем предложении, что я использовал «r + b», который я прочитал, является наиболее подходящим способом для открытия при изменении файла так, как я предполагаю. – user3376654

+1

Хорошо, не могли бы вы сделать [mcve]? – fuz

ответ

2

Вы не можете использовать sizeof(availableHoles) для итерации по массиву. Вы находитесь в функции, которая получает availableHoles в качестве указателя, его размер не имеет отношения к числу отверстий.

Передайте количество элементов этого массива в виде отдельного аргумента.

Использование потоков FILE в режиме чтения/записи затруднительно, вы звоните fseek() между режимами доступа в режиме чтения и в режиме записи?

Опубликовать код вызова, только одна функция addingAnimal недостаточно для расследования вашей проблемы.

+0

Я считаю, что вы имеете в виду мой цикл for-loop в самом конце, это просто обновление пустых отверстий. Эта часть работает правильно для моего понимания, это я ищу правильную строку файла, с которым у меня возникают проблемы. – user3376654

+1

@ user3376654 Нет, он работает неправильно. Если вы не верите, что тогда поместите оператор печати внутри цикла 'for'. Вы должны найти, что он не распечатывает количество раз, когда вы планировали цикл. Это может быть или не быть основной причиной вашей проблемы, но это, безусловно, неверно и должно быть исправлено, чтобы удалить эту возможность. – kaylum

 Смежные вопросы

  • Нет связанных вопросов^_^