Замена байтов при текущем смещении в c - PullRequest
0 голосов
/ 28 мая 2020

В настоящее время я разрабатываю программу, имитирующую файловую систему 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.)

Примечание: в примере не указано, но у меня есть два указателя на файлы для записи и чтения, и я осознаю, что мне нужно закрыть одно перед открытием другого.

1 Ответ

1 голос
/ 28 мая 2020

Думаю, вы ищете r+ (потенциально rb+ режим). Вот полный пример, после чего вы можете запустить grep -n hello data.txt, чтобы самостоятельно проверить результат. Вы можете запустить его с помощью make prog && ./prog.

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char const *argv[])
{
  FILE *file;

  file = fopen("data.txt", "w+");
  char dummy_data[] = "This is stackoverflow.com\n";
  int dummy_data_length = strlen(dummy_data);

  for (int i = 0; i < 1000; ++i)
    fwrite(dummy_data, dummy_data_length, 1, file);

  fclose(file);

  file = fopen("data.txt", "r+");
  fseek(file, 500, SEEK_CUR);
  fwrite("hello", 5, 1, file);
  fclose(file);
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...