LINUX.ORG.RU

[C++][stdlib] Изменить размер некоторого файла

 


0

1

Есть файл, достаточно большой, чтобы не возникало желание затолкать его в выделяемую память (new char[100500]), порядка нескольких сотен мегабайт. Как средствами плюсового stdlib (ну, на крайний случай, можно привлечь и boost) вырезать кусок из этого файла по указанным fpos_t? Результат, понятное дело, должен быть записан на место исходного файла.

Из первого вопроса логично вытекает и второй: а как вообще организуется работа текстовых редакторов, оперирующих большими и очень большими файлами? Как там делают вырезание, вставку, перемещение кусков текста? Есть литература для почитать? Или исходник какой не сильно здоровый, чтоб можно было в пару дней разобраться с его функционированием?

Сделать seek до нужной позиции, дальше в цикле переписать сколько нужно во временный файл. Ну и mv tmp file.

Nakgidveef
()
Ответ на: комментарий от one_more_hokum

считать бузд крайним случаем - «хехе»

Кажеться лучше сисколов и ifdef(для кроссплатформенности) тут не придумаешь

anonymous
()
Ответ на: комментарий от Nakgidveef

> Сделать seek до нужной позиции, дальше в цикле переписать сколько нужно во временный файл. Ну и mv tmp file.

Да кривовато, всё же, получается. Временные файлы использовать надо, внешнюю команду. А если я в винде работать буду? Там mv нет по умолчанию.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от anonymous

> считать бузд крайним случаем - «хехе»

В моём случае boost — это действительно крайний вариант, крайнее быть не может. Я не зря про stdlib спрашивал.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

Буст это только для того чтоб оно работало «прямо щас», а потом уже переписать по человечески

anonymous
()
Ответ на: комментарий от anonymous

по-человечески это как? вместо уже написанной и протестированной обертки над mmap'ом из буста изобретать свой велосипед?

Reset ★★★★★
()

> Как там делают вырезание, вставку, перемещение кусков текста?

Очевидный джентельментский набор: mmap, read, write, ftruncate, seek

Когда деревья были больше, а трава зеленее, на VMS делалось используя специфику файловой системы, то есть можно было вставлять и удалять записи из середины файла. Заодно ФС хранила версии.

MKuznetsov ★★★★★
()
Ответ на: комментарий от one_more_hokum

А если я в винде работать буду? Там mv нет по умолчанию.

Средствами API, две версии сорцов, под винду и под линукс.

К.О.

Dudraug ★★★★★
()

От начала вырезаемого куска нужно сделать по сути memmove. Можно (в цикле) сделать mmap и потом действительно memmove. Или просто выделить буфер и в него читать и писать со смещением.

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.