![]() |
|
Модераторы: bsa |
![]()
|
|
| Xenp |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 21.9.2014 Репутация: нет Всего: нет |
Есть к примеру файл с содержимым:
Задача: Записать в переменную "{FUN:1234567890:1234567890}" и удалить из файла. Прочитать я смог, я вот с удалением пошли проблемы:
В итоге все осталось на своих местах, только в конец он добавил какую то кашу из символов... Как исправить? Добавлено через 1 минуту и 34 секунды Выражение "{FUN:1234567890:1234567890}" всегда в начале файла, но его длина может отличатся Добавлено через 2 минуты и 44 секунды Длинна записана в result.Length() |
||||
|
|||||
| LeonidPr |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
Вычитываете из файла то что нужно удалить. затем создаете новый файл со случайным именем (он будет временным), читаете из исходного файла и пишете в результирующий то что должно в итоге остаться. далее закрываете оба дескриптора, удаляете исходный файл, а временный переименовываете. я так предлагаю, вроде как достаточно простой подход.
--------------------
pkunzip.zip |
|||
|
||||
| Xenp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 21.9.2014 Репутация: нет Всего: нет |
Вполне годно до каких то пор, но что делать если файл окажется размером скажем в 20Гб В итоге я из-за каких то максимум 28 байт, должен расположится в 40 Гб если конечно вообще места хватит... Может есть какой нибудь более менее лучшей способ? Это сообщение отредактировал(а) Xenp - 21.9.2014, 22:24 |
|||
|
||||
| NoviceF |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: 2 Всего: 2 |
Есть платформозависимые способы типа truncate для posix. Отображаешь файл в память, находишь конец искомой фразы, и весь оставшийся файл копируешь на начало файла используя memmove, синхронизируешь память с файлом fsync, обрезаешь файл при помощи truncate. Не уверен, что это будет работать, но можешь во всяком случае подумать в этом направлении. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Работать будет, но в сучае сбоя файл будет не восстановить. Поэтому, если есть свободное место, лучше работать с временным файлом.
|
|||
|
||||
| Vasya |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 5.7.2003 Репутация: нет Всего: нет |
Ну, а если в огромном файле хранятся данные маленького размера, можно где-то хранить описание файла, что и где записано, что считать мусором, и куда можно записать новые данные. Правда, реализация немного усложняется
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
В итоге получится своя файловая система. Xenp, если есть возможность, то надо проектировать программу таким образом, чтобы большие файлы были разделены на кучу/несколько маленьких, в которых не предусмотрена операция удаления из середины файла (с конца это сделать реальней). Если по каким-то причинам это невозможно, то остается только два способа: через копирование в новый файл (долго, много ресурсов) или через организацию аналога файловой системы. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |