В настоящее время я разрабатываю программу, имитирующую файловую систему UNIX. Я подготовил свой диск в виде файла (1 МБ), внутри которого были все блоки данных. Сейчас я выполняю несколько простых команд, таких как mkdir, ls et c. Чтобы работать с этими командами, мне нужно прочитать определенное смещение c (с этим нет проблем) и записать измененные блоки в указанное c местоположение.
Просто моя цель:
SIIID DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD (Текущий диск)
Я не хочу менять три блока с AAA после 16 байт, поэтому это будет примерно так:
SIIIDDDDDDDDDDDDAAAD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD (Модифицированный диск)
Я не собираюсь предоставлять все свои реализация здесь Я просто хочу иметь некоторые идеи по этому поводу, как я могу реализовать его без буферизации всех данных размером 1 МБ в моей программе. Короче говоря, я знаю расположение моих блоков данных, поэтому я просто хочу заменить эту часть моего файла, а не весь файл. Разве я не могу просто сделать это с помощью функций потока файлов?
Другой пример:
fseek(from_disk,superblock.i_node_bit_map_starting_addr , SEEK_SET); //seek to known offset.
read_bit_map(&from_disk); // I can read at specific location without problem
... manipulate bit map ...
fseek(to_disk,superblock.i_node_bit_map_starting_addr , SEEK_SET); //seek to known offset.
write_bit_map(&to_disk); //Write back the data.
//This will destroy the current data of file. (Tried with w+, a modes.)
Примечание: в примере не указано, но у меня есть два указателя на файлы для записи и чтения, и я осознаю, что мне нужно закрыть одно перед открытием другого.