|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
22.11.2013, 00:01 | #1 |
Пользователь
Регистрация: 03.10.2012
Сообщений: 67
|
способы удаления из файла
Здраствуйте, есть такой вопрос:
как еще можно организовать удаления записи из файла, но без дополнительного файла, и без массива(буфера), если кто знает, буду благодарен за алгоритм) P.s:файл типизированый |
22.11.2013, 00:06 | #2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
если нужно удалить K-ю запись, то можно в цикле переписать K+1 элемент на место K, K+2 на место K+1 и т.д. до последнего элемента массива.
Потом командой truncate обрезать файл по предпоследнюю запись включительно. Всё. p.s. способ и неэффективный и "опасный" - малейший сбой во время цикла и всё - прощай файл.. Поэтому вариант с созданием дополнительного файла более предпочтителен. А ещё лучше поступать так, как поступают СУБД - не удалять записи физически, а завести ещё одно поле, в котором хранить информацию о том, удалена запись или нет. Удалённые записи не показывать пользователю. |
22.11.2013, 01:51 | #3 |
Пользователь
Регистрация: 03.10.2012
Сообщений: 67
|
Спасибо за ответ, 1 способ что вы написала как раз мне нужен!)
Если можно, поподробней опишите способ методом СУБД, буду благодарен) |
22.11.2013, 08:39 | #4 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
пожалуйста!
дык, я уже выше попытался описать. ну, значит так. у Вас есть структура (она же запись) - т.к. файл типизированный, то значит элементы его имеют определённую структуру (впрочем, конечно, файл может состоять и из элементов одного из стандартных типов (int, long, double и т.д.), но способ, о котором я говорю предполагает имеено использование структуры!) в нашу структуру добавляем поле (ну, пусть это поле называется deleted): Код:
Смысл в том, что если в этом поле находится значение ИСТИНА (это либо 1, либо, в случае char, какой-то символ, отличный от пробела) - значит, эта запись является УДАЛЁННОЙ! Эту запись не нужно отображать пользователю. Более того, когда добавляем новую запись в файл, можно её писать не в конец файла, а вместо удалённой записи. При необходимости, можно за один проход переписать в файл все записи, у которых нет пометки об удалении (в терминах СУБД такая операция называется "сжатие данных", например, PACK в dBase подобных языках). преимущества использования отметки об удалении очевидны: - чтобы удалить 2-ю запись в файле с 100000 записей (бывает и много больше) не придётся перезаписывать 99998 записей с места на место, при этом повышается надёжность (меньше шансов получить мусор вместо данных) - запись может быть восстановлена в случае необходимости недостаток - увеличение (на 1 байт на каждую запись) занимаемой памяти. Теперь стало чуть-чуто понятнее? |
22.11.2013, 11:41 | #5 |
C/C++, Java
Участник клуба
Регистрация: 28.03.2012
Сообщений: 1,679
|
byte в Си нет!!!! а так вообще интересный способ... Спасибо!
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости" Сложность - враг простоты и удобства! |
22.11.2013, 22:10 | #6 |
Пользователь
Регистрация: 03.10.2012
Сообщений: 67
|
Спасибо и да, стало чуть понятнее))
еще одна просьба если можно: сама организация етого метода (тоесть алгоритм) можете подкинуть? вот у меня такая структура: Код:
p.s.:по дате еще не успел зделать Код:
Код:
Буду благодарен за ответ) |
22.11.2013, 23:09 | #7 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
I'm learning to live...
|
||
23.11.2013, 00:25 | #8 |
Пользователь
Регистрация: 03.10.2012
Сообщений: 67
|
просто так захотел сделать), думаю хорошо смотриться
|
23.11.2013, 20:06 | #9 |
Пользователь
Регистрация: 27.02.2010
Сообщений: 90
|
Я делаю так, читаю последнюю запись в файле, записываю её на место стираемой записи, затем обрезаю файл на одну запись. Способ с СУБД хорош только тогда, если планируется когда - либо востановить удаленную запись, в противном случае, разростание базы данных до колосальных размеров при малом колличестве полезных записей и увеличении времени на обработку самой базы (как итог).
Код:
как-то так
Последний раз редактировалось Arhangel7; 23.11.2013 в 20:09. |
23.11.2013, 21:20 | #10 | |
Пользователь
Регистрация: 03.10.2012
Сообщений: 67
|
Интересный способ, большое спасибо)
Возможно у вас есть алгоритм ниже описаного удаления, буду благодарен если найдеться) Цитата:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
неработает функция удаления из файла | 3Doleg | Общие вопросы C/C++ | 0 | 05.11.2013 19:00 |
Способы удаления элемента массива в StringGrid | dariya.95 | Помощь студентам | 23 | 28.06.2013 23:09 |
Способы изменения файла на сервере | gufon | Работа с сетью в Delphi | 1 | 19.04.2011 10:47 |
Способы уменьшения исполняемого файла в Delphi 2010 | STRELOK-2007 | Общие вопросы Delphi | 3 | 23.06.2010 12:23 |
Способы ведения файла-лога | Norfolk | Общие вопросы Delphi | 2 | 14.06.2007 20:47 |