Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
FRIEND_
2 / 2 / 1
Регистрация: 09.02.2017
Сообщений: 63
1

Редактирование файлов

11.02.2017, 01:58. Просмотров 835. Ответов 1
Метки нет (Все метки)

Здравствуйте)
Уж простите, что так с файлами задалбываю, но решил понять эту тему хорошенько)
Сейчас хочу задать чисто теоретический вопрос без кода)
Например, в наличии огромный файл (10 гигабайт) с массивом структуры, которая имеет поля ФИО (string), день, месяц, год рождения и адрес проживания (string). И вот в ходе работы с программой нужно удалить какую-то запись. Вариант с перекидыванием всего содержимого без удаляемого элемента в временный файл уж очень ресурсоёмкий и длительный. Тогда как дальше поступать, что делать? Насколько я понял, то удалить нужную запись уже не получится. Тогда у меня есть два варианта:
1) в начале файла сделать место для массива типа int из 100 элементов. И тогда по мере поступления запросов на удаление записей, в данные ячейки заносить информацию об номерах удалённых записей, но сами записи будут храниться в этом файле дальше. При доступе к этому файлу данные удалённые записи не будут выводиться. Когда эти 100 ячеек будут заполнены - произвести сброс, то есть перезаписать весь файл в новый, но без удалённых записей.
2) создать другой файл, в который при удалении записей будет заноситься их порядковый номер. Тогда при записи новых данных в файл с записями будет проверяться файл с номерами удалённых записей (но они до сих пор находятся в файле) и тогда новые данные будут записываться поверх тех, которые нужно удалить, при помощи ofstream::write() (как я понял, если через file.seekp() указать позицию, write() запишет, начиная с этой позиции, поверх следующих n байтов, а не сместит их???). Наши записываемые данные, которые будут писаться поверх удалённых, будут оптимизироваться в том плане, что записуемые stringи будут при помощи resize() подстроены под старые данные, чтобы ненароком не залесть на то, что удалять не нужно.

Пожалуйста, подскажите и выскажите свои мысли по данному вопросу) Буду очень благодарен, т. к. данный момент уж очень въелся в мысли
Спасибо за помощь)

Добавлено через 16 минут
Забыл сказать, что в первом варианте можно юзать дополнительный файли со 100 ячейками для номеров удалённых записей вместо массива в начале файла.
А во втором варианте забыл уточнить, что после перезаписи удалённой записи новой номер перезаписанной записи из файла с номерами удалённых файлов будет стираться.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2017, 01:58
Ответы с готовыми решениями:

редактирование файлов
покажите пожалуйста хотя бы пример программы, которая редактирует строчки в...

Редактирование файлов
Надо спомощю структур и файлов реализовать функцию редактирование елемента...

Редактирование .mp3 файлов
Написать программу для редактирования ID3v 1-тегов mp3-файлов ...

Редактирование wav файлов
Добрый день, друзья. Подскажите, кто сможет, как в С++ именно в консольном...

Чтение и редактирование файлов .cod
Как можно открыть и посмотреть что в этом файле, какие данные и т.д. возможно...

1
gazlan
3141 / 1917 / 311
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
11.02.2017, 03:13 2
Лучший ответ Сообщение было отмечено FRIEND_ как решение

Решение

В принципе, все верно. То что вам нужно, называется база данных / файловая система.

В простейшем случае (размер записи фиксирован и известен заранее), возможно перезаписывание по месту, с учетом удаленных блоков (либо отдельным файлом, либо маркировкой блока). В более общем случае, когда ни размер ни количество записей заранее не известны, дисковое пространство выделяется блоками фиксированного размера, в которых (целиком или "в нарезку") размещается запись. Механизм учета примерно тот же: частью отдельными файлами (индексами), частью маркировкой удаленных блоков. Индексные файлы и сами могут содержать списки удаленных блоков. По возможности, запись идет в свободные блоки, при невозможности - выделяются новые, при простое (или по команде) происходит "сжатие" - перезапись в новый файл - с удалением пустых блоков.

Понятно, что в реальных DB / FS на все это накладывается резервирование, журналирование, оптимизация (кэширование / работа в памяти) итп., но общий подход сохраняется.

По теме, можете посмотреть устройство файлов dBase, ISAM и индексов (обычно, это варианты BTree / B+Tree).

Отдельной строкой идут, т.н. константные (только для чтения) базы данных (например, они используются для хранения ресурсов в Pascal / Delphi) и основаны на Bernstein's Cdb (TinyCDB - a Constant DataBase).
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2017, 03:13

Подключение текстовых файлов и их редактирование
При объявлении переменной типа ofstream пишет не объявленный идентификатор,...

Редактирование(добавление/удаление) объемных текстовых файлов
Предположим, есть большой текстовый файло размером 1гб, из которого нужно...

Написать программу, которая обеспечивает:начальное формирование каталога файлов;вывод каталога файлов;удаление файлов...
Уважаемые хакеры!Прошу вашей помощи!Я в СИ не особо шарю.((( А на днях уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru