Замена элемента с определенной позиции в файле в C ++ - PullRequest
0 голосов
/ 19 апреля 2019

Я столкнулся с проблемой построения логики.

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

David The Angel 20-04-2019
Bilal Learning how to read 20-04-2019
Sarah The subtitle art of not giving the <expletive deleted> 20-04-2019

Теперь я хочу изменить дату второй строки с 20-04-2019 на 25-04-2019

Как я могу это сделать?

1 Ответ

1 голос
/ 19 апреля 2019

Чтобы заменить байты с позиций S (включительно) на E (эксклюзив) в файле с байтовым массивом длиной L, необходимо рассмотреть 3 возможных случая:

  • E - S == L: простой случай, размер файла не меняется. искать до S и записывать L байтов.

    // overwriting 4 bytes with 4 bytes
    oooS---Eooo
    oooLLLLEooo
    
  • E - S < L: при записи большего количества файлов размер увеличивается. В качестве первого шага «переместите» каждый байт, начиная с E на L - (E - S) «дальше назад». Это оставляет место для записи L байтов в S без перезаписи байта, который был в E (и следующих байтах). После того, как это «перемещение» завершено, найдите S и запишите L байт.

    // replacing 4 bytes with 6 bytes
    oooS---Eooo
    oooS---??Eooo
    oooLLLLLLEooo
    
  • E - S > L: при меньшей записи в файл размер уменьшается. В качестве первого шага «переместите» каждый байт, начиная с E на (E - S) - L «дальше вперед» файла. Это уменьшает пространство между S и новой позицией байта, которая была в E, чтобы быть точно L байтов в длину. Теперь самое сложное: обрезать файл (помните, размер уменьшился!). Файловая система C ++ 17 TS имеет resize_file для этого, в противном случае используйте a) некоторую библиотеку (повышение?) B) вызовы, зависящие от платформы (truncate в системах POSIX). Наконец, запишите L байтов в S.

    // replacing 4 bytes with 2 bytes
    oooS---Eooo
    oooS-Eooo??
    oooS-Eooo
    oooLLEooo
    
...