![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 03.10.2012
Сообщений: 67
|
![]()
Здраствуйте, есть такой вопрос:
как еще можно организовать удаления записи из файла, но без дополнительного файла, и без массива(буфера), если кто знает, буду благодарен за алгоритм) P.s:файл типизированый |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
если нужно удалить K-ю запись, то можно в цикле переписать K+1 элемент на место K, K+2 на место K+1 и т.д. до последнего элемента массива.
Потом командой truncate обрезать файл по предпоследнюю запись включительно. Всё. p.s. способ и неэффективный и "опасный" - малейший сбой во время цикла и всё - прощай файл.. Поэтому вариант с созданием дополнительного файла более предпочтителен. А ещё лучше поступать так, как поступают СУБД - не удалять записи физически, а завести ещё одно поле, в котором хранить информацию о том, удалена запись или нет. Удалённые записи не показывать пользователю. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 03.10.2012
Сообщений: 67
|
![]()
Спасибо за ответ, 1 способ что вы написала как раз мне нужен!)
Если можно, поподробней опишите способ методом СУБД, буду благодарен) |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
пожалуйста!
дык, я уже выше попытался описать. ну, значит так. у Вас есть структура (она же запись) - т.к. файл типизированный, то значит элементы его имеют определённую структуру (впрочем, конечно, файл может состоять и из элементов одного из стандартных типов (int, long, double и т.д.), но способ, о котором я говорю предполагает имеено использование структуры!) в нашу структуру добавляем поле (ну, пусть это поле называется deleted): Код:
Смысл в том, что если в этом поле находится значение ИСТИНА (это либо 1, либо, в случае char, какой-то символ, отличный от пробела) - значит, эта запись является УДАЛЁННОЙ! Эту запись не нужно отображать пользователю. Более того, когда добавляем новую запись в файл, можно её писать не в конец файла, а вместо удалённой записи. При необходимости, можно за один проход переписать в файл все записи, у которых нет пометки об удалении (в терминах СУБД такая операция называется "сжатие данных", например, PACK в dBase подобных языках). преимущества использования отметки об удалении очевидны: - чтобы удалить 2-ю запись в файле с 100000 записей (бывает и много больше) не придётся перезаписывать 99998 записей с места на место, при этом повышается надёжность (меньше шансов получить мусор вместо данных) - запись может быть восстановлена в случае необходимости недостаток - увеличение (на 1 байт на каждую запись) занимаемой памяти. Теперь стало чуть-чуто понятнее? |
![]() |
![]() |
![]() |
#5 |
C/C++, Java
Участник клуба
Регистрация: 28.03.2012
Сообщений: 1,680
|
![]()
byte в Си нет!!!!
![]()
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости" Сложность - враг простоты и удобства! |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 03.10.2012
Сообщений: 67
|
![]()
Спасибо и да, стало чуть понятнее))
еще одна просьба если можно: сама организация етого метода (тоесть алгоритм) можете подкинуть? вот у меня такая структура: Код:
p.s.:по дате еще не успел зделать Код:
Код:
Буду благодарен за ответ) |
![]() |
![]() |
![]() |
#7 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Цитата:
I'm learning to live...
|
||
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 03.10.2012
Сообщений: 67
|
![]()
просто так захотел сделать), думаю хорошо смотриться
|
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 27.02.2010
Сообщений: 90
|
![]()
Я делаю так, читаю последнюю запись в файле, записываю её на место стираемой записи, затем обрезаю файл на одну запись. Способ с СУБД хорош только тогда, если планируется когда - либо востановить удаленную запись, в противном случае, разростание базы данных до колосальных размеров при малом колличестве полезных записей и увеличении времени на обработку самой базы (как итог).
Код:
как-то так
Последний раз редактировалось Arhangel7; 23.11.2013 в 20:09. |
![]() |
![]() |
![]() |
#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 |