Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами записей, Файлы 
:(
    Опции темы
PsiMagistr
Дата 23.4.2010, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



День добрый. У меня возник такой вопрос. Для начала немножко кода:

Код

//Создадим шаблон записи. Поля: Имя, Отчество, Фамилия, Возраст.

type TPerson = packed record

Name:string[20];
Patronymic:string[20];
Family:string[20];
Age:integer;

end;

//Бросаем на форму 4 текстовых поля (Т1, Т2, Т3, Т4) и кнопочку Button1. В коде обработчика Click кнопки, пишем:

procedure TForm1.Button1Click(Sender: TObject);

var F:file of TPerson; Rec:TPerson; //Объявляем переменные: F - файловый дескриптор, Rec - запись.

begin

AssignFile(F, 'Proba.dat')// Чуть не забыл ).  Ассоциация. Вообще то это можно в загрузке формы приписать и выполнить один раз а не при каждом нажатии на кнопку. 

// Заполняем поля записи:

Rec.Name:=T1.Text;
Rec.Patronymic:=T2.Text;
Rec.Family:=T3.Text;
Rec.Age:=StrToInt(T4.Text);

If FileExsists('Proba.dat') then //Если файл Proba.dat существует, то:

begin

Reset(f) //Открываем для добавления новых записей.
Seek(F,FileSize(f)) // И сразу же переходим в конец файла.

end

else //Иначе:

Rewrite(f); //Создаем файл. Здесь переходить в конец не нужно. Файл новый.



Write(F, Rec); //Пишем в файл запись Rec.

CloseFile(F); //Закрываем Файл.
end;


А теперь вопрос. Дело в том, что мне нужно не только добавлять записи, но и удалять их. В некоторой степени я решил эту проблему созданием временной копии файла, куда пошагово в цикле копируются все записи кроме удаленной. После чего оригинал и его временная копия закрываются. Оригинал удаляется, а копии присваивается имя оригинала. Неужели нет менее трудоемкого способа, каких нибудь функций удаления? Я нигде не нашел.


Это сообщение отредактировал(а) PsiMagistr - 25.4.2010, 16:37


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
~FoX~
Дата 23.4.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 5
Всего: 68



Нету... тока руками.... 
Переходи на ini, xml или mdb


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Mikel
Дата 23.4.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: нет
Всего: 2



Ну удаление можно, например, сделать так... Найти в файле запись которую надо удалить, записать на ее место последнюю запись и уменьшить размер файла (если порядок элементов не важен). Либо читать сразу все записи в массив/список с ним работать и по завершении работы переписывать файл.


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
Alexeis
Дата 23.4.2010, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



  Можно в записи хранить дополнительный байт для флагов записи. Скажем если там будет записана единица то запись живая, если 0, то помеченная как удаленная. При загрузке создаешь список позиций где удаленные записи. Если нужно записать новую запись выбираешь любую запись помеченную как удаленную и записывать туда данные, после чего флаг меняешь на единицу и удаляешь ее индекс из массива удаленных записей.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 23.4.2010, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Более трудоёмкий способ есть всегда.
Например - писать на ассемблере...
PM MAIL   Вверх
PsiMagistr
Дата 23.4.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Спасибо, Fox, спасибо Mikel, спасибо Alexeis, спасибо Snowy. Ваша помощь неоценима. Snowy, ошибку исправил, так что ASM пролетает. )))))

Способы тяжеловатые, увы.  Как же это разрабы не додумались до какой нибудь Delete(f, position), просто жалко. Я как прикину что в файле 10 000 записей. Это ж застрять посреди любого цикла как пить дать...

Ребята, а где можно прочитать про MDB подробную статью или книжку хорошую? Чую, придется на базы данных садиться вплотную.





Это сообщение отредактировал(а) PsiMagistr - 23.4.2010, 11:40


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Snowy
Дата 23.4.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Так уж устроены файлы, что сделать Delete в них невозможно.
Можно отпилить конец файла или нарастить его.
Можно переписать часть файла.
Но вырезакть кусок из середины невозможно физически.
Самый простой вариант, как уже говорилось, взять последнюю запись и записать её на место удалённой.
А файл укоротить на одну запись путём отрезания хвоста.
Так нарушается очерёдность записей, но зато самый простой и быстрый путь.
Путь, предложенный Alexeis'ом - типичный для баз данных.
Они физически не удаляют запись, а просто помечают её, типа - это не трогаем - оно не считается.
Такой подход полезен при частых удалениях.
Можно 300 раз пометить, а потом в конце дня, например, переписать весь файл, не включая помеченные записи.
PM MAIL   Вверх
PsiMagistr
Дата 23.4.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Насколько я понимаю записать в середину файла тоже затруднительно. Даже если выставить указатель Seek(f, position) в нужное положение, нижняя половина файла срежется. Т.е. мы запишем как бы в конец...

Верно или нет?


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Alexeis
Дата 23.4.2010, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(PsiMagistr @  23.4.2010,  13:35 Найти цитируемый пост)
Даже если выставить указатель Seek(f, position) в нужное положение, нижняя половина файла срежется

Работает запись в середину. Ошибка скорее всего в коде.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 23.4.2010, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Чтоб я помнил.
Попробуй...
Я просто давно не пользовался древними механизмами записи - уже не помню.
Стримы точно не отрезают, если не приказать.

Добавлено через 35 секунд
Что-то я сегодня везде не успеваю ответить smile
PM MAIL   Вверх
PsiMagistr
Дата 23.4.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Точно так. Запись в середину прекрасно работает. Alexeis совершенно прав. Наверно я с флагами удаление сделаю, по Вашему методу. Плюс флаг можно в любой момент вернуть, пока окончательно запись не стер.

Snowy, да я сам недавно начал пользоваться. Ваяю одну игрушку-самоделку. Решил начать с механизмов сохранения. 

У меня удаление проходит через копию файла, куда пошагово через цикл пишем записи, окромя удаленных. Копия потом замещает оригинал само собой. Все работает, но выглядит стремно... Я сам этого кода боюсь. Частое обращение к диску. Файл не закрывается на протяжении всей работы. При загрузке файла определенное поле всех записей заносится в список (ListBox). Перемещение по пунктам этого списка, соответственно считывает нужную запись прямо из файла и выводит в в текстовые поля для возможного редактирования.

Насколько это вредно для ПК мотыляться туда сюда по диску при каждом щелчке на нужный пункт списка? 





Это сообщение отредактировал(а) PsiMagistr - 23.4.2010, 15:44


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Snowy
Дата 23.4.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Да ни на сколько не вредно.
Файловые операции во-первых кэшируются операционкой, во-вторых самим диском.
Система расчитана на такие действия - для неё это обычное дело.
Никакого криминала тут нет.
PM MAIL   Вверх
PsiMagistr
  Дата 25.4.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



У себя на пробу реализовал удаление с флагами . Биг спасибо, Alexeis. Существенно подправил кусочек кода здесь на странице. Компилятора нет под рукой, но думаю теперь все работает как должно.

Наверно перейду на ini. Возни меньше. smile Правда любой дурак в блокноте изменит... Это минус.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Alexeis
Дата 25.4.2010, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(PsiMagistr @  25.4.2010,  15:45 Найти цитируемый пост)
Наверно перейду на ini. Возни меньше. 

  Насколько я знаю для ini файлов есть ограничение на 64кб. Кроме того доступ гораздо медленнее, ведь для прочтения любой строки из середины требуется анализ всех вышестоящих строк. Запись фиксированного размера позволяет обращаться по индексу прямо считывая из нужного места блок, а не разбирая половину файла.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
PsiMagistr
Дата 25.4.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



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



Вы имеете ввиду запись типа record?


В Windows 98 ограничение на размер ini-файла точно существует. В Хр и выше система ограничивать не должна. Но вот не запутается ли сам дядюшка компилятор... Большой вопрос.




Это сообщение отредактировал(а) PsiMagistr - 25.4.2010, 17:27


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.