Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2012, 16:09   #1
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию Удаление структуры из файла

Всем привет. У меня такая ситуация: записываю в файл заполненную структуру. Потом пользователь "удаляет" ее путем обнуления данных, при этом в файле со временем накапливается много "пустых" структур.

Можно ли физически удалить данные из файла?.

Как вариант, проверять перед записью в файл наличие пустых структур и записывать на это место новую.

Заранее спасибо!
Желание тысяча возможностей, нежелание - тысяча причин
Стремящийся вне форума Ответить с цитированием
Старый 09.08.2012, 17:12   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,719
По умолчанию

Цитата:
Можно ли физически удалить данные из файла?
Дам вам пищу для мозга: Что такое структура в памяти? А как она лежит в файле? И главный вопрос, который обмусолевался 100500 раз, можно ли удалить байт (байты) из середины файла?

П.С. Отвечать не надо, т.к. вопросы 100500 раз отвечены... даже недавно тут на форуме было.
p51x вне форума Ответить с цитированием
Старый 09.08.2012, 18:16   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
со временем накапливается много "пустых" структур.
Многие СУБД так работают и не гнушаются этим.
Впрочем - в цикле считывай в новый файл неудаленные записи, пропуская удаленные.
После старый файл сотри а новый переименуй.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2012, 18:37   #4
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию

Да, согласен. Однако, у меня файл с одним именем используется во многих функциях программы, как тогда быть?
Желание тысяча возможностей, нежелание - тысяча причин
Стремящийся вне форума Ответить с цитированием
Старый 09.08.2012, 19:28   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Стремящийся Посмотреть сообщение
Да, согласен. Однако, у меня файл с одним именем используется во многих функциях программы, как тогда быть?
Не использовать "файл" во многих функциях программы. Очевидно же!
Во-первых, это долго. А во-вторых, негибко.

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

Надеюсь, ты знаешь, как удалять/добавлять/перемещать байты в обычном контейнере данных? Это намного проще, чем мудохаццо с "файлами".

"файл, который на жестком диске" ты используешь один раз при старте, и один раз по окончании работы.

Все остальное время - работаешь с памятью

Пихать в файл "пустоту" - не самое оптимальное решение.
_Bers вне форума Ответить с цитированием
Старый 09.08.2012, 21:27   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Лучше в начале работы загрузить "файл" в память
Ой! А если он со всеми дырами до гига раздуется?
Цитата:
как тогда быть?
Чет я не особо понял чем множество функций помешало...
Если речь идет о нескольких потоках, одновременно пытающихся работать с файлами то тут спасут системы транзакций и синхронизации доступа к файлу.
Короче ты по факту получается свое СУБД пишешь. Рекомендую придерживаться общих принципов, если конечно это не узконаправленная система, требующая именно нестандартного подхода в силу задачи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2012, 21:46   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ой! А если он со всеми дырами до гига раздуется?
А зачем его со всеми дырами держать?
_Bers вне форума Ответить с цитированием
Старый 09.08.2012, 22:05   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
_Bers
А зачем по твоему СУБД дефрагментацию не проводят часто?
Дыры как ни странно ускоряют доступ - если хранишь карты быстрого доступа типа индексов то дыры позволяют поддерживать скорость доступа к данным. А если фрагменты уберешь то придется и карты перестраивать. Не исключено что автор придет к модели индексации в своем приложении, и это будет лучший выход чем чистка файлов-чанков, содержащих данные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2012, 22:22   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А зачем по твоему СУБД дефрагментацию не проводят часто?
Дыры как ни странно ускоряют доступ - если хранишь карты быстрого доступа типа индексов то дыры позволяют поддерживать скорость доступа к данным. А если фрагменты уберешь то придется и карты перестраивать. Не исключено что автор придет к модели индексации в своем приложении, и это будет лучший выход чем чистка файлов-чанков, содержащих данные.
СУБД, которые работают с большими хранилищами данных, и при этом, обязаны сохранять результаты своей деятельности на диске в различные моменты (допустим - требования к безопасности) - оставляют дыры, ибо в силу своей профилированности, с легкостью пережовывают их.

Дыры здесь - для ускорения работы (незачем экономить байты, если работать нужно с гигабайтами).

Однако, СУБД не делают дырок по поводу и без повода.
Все что только возможно - берется в память. Нет ни одной причины держать в памяти дырки, и ни одной причины сохранять дырки обратно в файл.

хранилище на жестких дисках - это всего лишь хранилища и не более того. Источником данных для различных операций является память.

СУБД лишь подгружает с диска время от времени те данные, которые здесь и сейчас еще не были загружены ранее. И кэширует все что только можно в памяти, что бы лишний раз не дергать хранилище.
_Bers вне форума Ответить с цитированием
Старый 09.08.2012, 23:21   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ой! А если он со всеми дырами до гига раздуется?
Поставит х64
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление структуры из файла Axrik Общие вопросы C/C++ 1 09.06.2012 11:20
Запись структуры из файла Evgeniy21 Общие вопросы C/C++ 2 15.05.2012 13:54
Чтение структуры из файла! Olegzxc Общие вопросы C/C++ 1 01.12.2011 00:40
УДаление строки из файла методом создания временного файла. dykatob Общие вопросы C/C++ 3 28.05.2011 01:46
Удаление(добавление) поля из(в) структуры kilgoreq Помощь студентам 0 22.02.2011 00:59