Как обрезать файл C++

755
07 февраля 2017, 20:54

Я имею текстовый файл, ассоциированный с объектом std::fstream.

std::fstream finout("text.txt");

Затем из этого файла производиться чтение. Считанные данные анализируются и некоторые из них удаляются. Таким образом размер выходных данных может уменьшиться и возникает необходимость усечь файл (либо же изменить его размер). Кажется совершенно глупо и расточительно создавать новый файл и записывать результат в него. Мне хотелось бы получить более эффективный и простой способ добиться желаемого результата. Язык Си предлагает функции ftruncate и chsize, однако я использую объект класса std::fstream.

P. S. На англоязычных сайтах я встречал подобные вопросы, но мне хотелось бы узнать мнение русскоязычной аудитории.

Answer 1

fstream не поддерживает подобных операций.

Можете попробовать использовать std::experimental::filesystem::resize_file (c++17)

Ну или старые добрые _chsize/ftruncate.

Answer 2

Вопрос неправильно поставлен - если данные в файле удаляются произвольно, в любой месте - какое тут может быть обрезание?? Формировать файл заново а старый удалять. Однако если это ну ооочень большой файл и переформировать его нерационально - можно использовать seekp - в этом случае можно придумать какую-то структуру файла, чтобы помечать удаляемые куски как пустые, затем при пополнении данных искать подходящего размера пустые куски и записывать туда - хоть в начала, в середине, в конце файла...

READ ALSO
как работает reinterpret_cast

как работает reinterpret_cast

Есть фрагмент кодаПочему в нем используется reinterpret_cast и как именно он работает? Почему тут не использовали static_cast?

548
Конфликт в определении типа данных

Конфликт в определении типа данных

Есть два h-файла, в которых определен тип данных:

619
Перечисление полей структуры

Перечисление полей структуры

Есть структура и функции:

530
Разный статус заказа в один момент времени для разных пользователей

Разный статус заказа в один момент времени для разных пользователей

Коллеги, задумался над такой проблемой: как сделать разный статус заказа в один момент времени для разных пользователей?

515