Как удалить запись в массиве фиксированной длины в C? - PullRequest
0 голосов
/ 09 апреля 2020

Я работаю над программой, которая напоминает Unix Файловую систему. Я работаю в C. Я застрял на следующей проблеме:

  • Рассматриваемая функция - это функция, которая удаляет указанную запись файла c из каталога.
  • В каталоге есть iNode и блок данных. Этот блок данных является массивом фиксированного размера, в котором я хочу удалить запись.
  • Массив, в котором я работаю, является массивом фиксированной длины из 14 записей структур
  • . Структура выглядит следующим образом:
typedef struct {
    int16_t iNodeNumber;
    char Filename[14];
} Entry;

Обратите внимание, что память массива находится в стеке, а не в куче.

Что я хочу: Удалить Speci c запись из массива при сохранении длины массива

Что я сделал: Я заменяю текущую позицию (ту, которую я должен удалить информацию) на содержимое следующего индекса, пока я не достигну конца массива. Таким образом, я могу убедиться, что после удаления каждая запись, имеющая пустой блок в следующей позиции массива, фактически является последней. (Без фрагментации)

Однако это не работает, если я хочу удалить последнюю запись массива (позиция 13). Также я подумал о том, чтобы установить пустое значение для имени файла, но как насчет iNodeNumber? Это число от 2 до 23; 0 и 1 указывают c номера iNode, зарезервированные для другого использования.

Спасибо!

РЕДАКТИРОВАТЬ: Вот еще несколько объяснений проблемы: скажем, у нас есть каталог, давайте возьмем этот каталог.

/ example

В UFS каждый файл представлен как Inode, а не имя, этот каталог будет представлен этой структурой:

typedef struct {
stat iNodestat;
int16_t dataBlock[14]
} iNodeEntry

Структура stat может быть опущена, это просто структура, которая содержит информацию об индексе, такую ​​как число, режим, файл size, et c.

Этот блок данных представляет собой массив целых чисел. Эти целые числа просто ссылаются на блок памяти. Обычный файл iNodeEntry может иметь 14 блоков данных. В случае каталога он имеет только один блок данных. Этот единственный номер блока ссылается на блок памяти, который содержит Array , который является темой этого поста.

Этот массив состоит из структуры Entry , показанной выше. Он содержит ровно 14 таких структур.

В заключение приведу конкретный пример. Обратите внимание:

  • / пример каталога не имеет файла
  • его номер iNode равен 2

В этом случае две записи будут заполнены информацией из 14 доступно в массиве:

  • имя файла: '.' , номер iNode: 2
  • имя файла: '..', номер iNode: независимо от номера iNode родительского каталога
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...