Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/46: Рейтинг темы: голосов - 46, средняя оценка - 4.63
Lerby
4 / 4 / 0
Регистрация: 30.05.2013
Сообщений: 61
1

Удаление и редактирование записи из типизированного файла

20.10.2013, 17:22. Просмотров 8486. Ответов 8
Метки нет (Все метки)

Здравствуйте! Я хотел бы узнать, возможно ли удалить запись из типизированного файла без перезаписи?
Так же мне необходимо реализовать редактирование записи, что, конечно же, хотелось бы сделать без полной перезаписи.

PS Дело в том, что задание гласит "При удалении записи реализовать минимальное изменение содержимого файла", по этому полная перезапись, как я полагаю, не подходит.

Заранее спасибо за ваши ответы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2013, 17:22
Ответы с готовыми решениями:

Удаление записи из типизированного файла (StringGrid)
Подскажите, пожалуйста, как удалить запись по номеру? Сам пробовал, но после...

Редактирование типизированного файла
Доброго времени суток! Прощу помощи с решением моей проблемы. Вот формулировка...

Удаление из типизированного файла
Привет, Ребятки!))) Столкнулся вот с какой проблемой!( Есть процедура...

Удаление из типизированного файла
Уважаемые, помогите разобраться. При удалении записи из типизированного файла...

Удаление из типизированного файла по условию
Надо сделать удаление по условию, то есть несколько записей сразу. Ошибку...

8
Puporev
Модератор
55095 / 42346 / 29247
Регистрация: 18.05.2008
Сообщений: 100,064
20.10.2013, 17:43 2
Цитата Сообщение от Lerby Посмотреть сообщение
возможно ли удалить запись из типизированного файла без перезаписи?
Можно.Можно по номеру записи или по значению одного или нескольких полей.
Общий принцип удаления такой(это в Паскале, но суть не меняется)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//удаление записей по полю
k:=0;i:=0;
while i<=filesize(f)-2-k do{последнюю пока не проверяем, выйдем за файл}
 begin
  seek(f,i);
  read(f,z);
  if z.naz='Информатика' then
   begin
    k:=k+1; {считаем}
    for j:=i to filesize(f)-2 do{идем вперед}
     begin
      seek(f,j+1);{переставляем - сдвигаем - записи вверх на 1}
      read(f,b);
      seek(f,j);
      write(f,b);
     end
   end
  else i:=i+1;{если нет вперед}
 end;
seek(f,filesize(f)-1-k);{проверяем последнюю, она сдвинулась на к вверх}
read(f,z);
if z.naz='Информатика' then k:=k+1;
seek(f,filesize(f)-k);{встаем в последнюю не удаленную запись}
truncate(f);{обрезаем файл}
//удаление записи по номеру в файле
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
procedure Del_N(var f:fail);//удаление записи
var n,i:integer;
    c:char;
    x:stud;
begin
write('Удалить запись № ');
readln(n);
reset(f);
if (filesize(f)<n)or(n<0) then
 begin
  writeln('В файле нет такой записи');
  close(f);
  write('Press Enter...');
  readln;
  exit;
 end;
seek(f,n-1);//встаем на запись, ее индекс на 1 меньше, начинается с 0
for i:=n-1 to filesize(f)-2 do//сдвигаем записи на 1 вверх к этой, она исчезает
 begin
  seek(f,i+1);
  read(f,x);
  seek(f,i);
  write(f,x);
 end;
seek(f,filesize(f)-1);//встаем в пред-конец
truncate(f);//обрезаем последнюю, пустую, запись
close(f);
write('Press Enter...');
readln
end;
1
Lirrk
Заблокирован
20.10.2013, 18:49 3
Написано же, минимальные изменения. А "поджим хвоста" равносилен полной перезаписи.
Если речь идёт о записях то есть элементов постоянной длины, а их последовательность не играет роли то достаточно последний элемент поставить на место удаляемого и ограничить размер файла.
Можно сделать и вообще не удаляя, если организовать последовательный список. То есть первый элемент в записи сделать ссылкой на следующую запись.Тогда достаточно в предыдущем удаляемому элементу месте ссылки перезаписать адрес на следующую за удаляемой запись. В принципе можно обнулить весь элемент, если данные представляют важность, а в месте ссылки поставить специальный код, что запись стёрта. Но Это так называемое "псевдоудаление" и это должна учитывать программа, работающая с записями.
1
Lerby
4 / 4 / 0
Регистрация: 30.05.2013
Сообщений: 61
20.10.2013, 20:05  [ТС] 4
Цитата Сообщение от Lirrk Посмотреть сообщение
Если речь идёт о записях то есть элементов постоянной длины, а их последовательность не играет роли то достаточно последний элемент поставить на место удаляемого и ограничить размер файла.
т.е. по сути отредактировать удаляемую запись, которая находится, например, по середине?
Как отредактировать без перезаписи файла?)
0
Lirrk
Заблокирован
20.10.2013, 21:25 5
Ну редактировать не труднее. Вы просто вычисляете позицию нужной записи в файле и считываете её.
Все данные окажутся в записи. А далее дело техники.
Скажем у вас запись RR
В ней 2 элемента
Name
age


и вспомогательные переменные.
SS для строки
DD для числа

ну вот и меняем
Delphi
1
2
3
4
5
6
Writeln('Имя');
Readln (SS);
if SS <>'' then RR.Name;
Writeln('Возраст');
Readln (DD);
if DD <> 0 then RR.ago:=DD;
И опять берём позицию записи и записываем запись на место.


Только вот делать редакторы в консоли - убийство.

Добавлено через 7 минут
У вас должно быть общее меню.
1 Создать
2 Редактировать
3 Выход

Delphi
1
2
3
4
5
6
Writeln('1 Создать');
Writeln('2 Редактировать');
Writeln('3 Выход');
Writeln('----------------');
Write('Выбор? ');
Readln(V);
Добавлено через 1 минуту
Ну далее можно через Case
1
Lerby
4 / 4 / 0
Регистрация: 30.05.2013
Сообщений: 61
20.10.2013, 22:28  [ТС] 6
Цитата Сообщение от Lirrk Посмотреть сообщение
Ну редактировать не труднее. Вы просто вычисляете позицию нужной записи в файле и считываете её.
Все данные окажутся в записи. А далее дело техники.
Скажем у вас запись RR
В ней 2 элемента
Name
age


и вспомогательные переменные.
SS для строки
DD для числа

ну вот и меняем
Delphi
1
2
3
4
5
6
Writeln('Имя');
Readln (SS);
if SS <>'' then RR.Name;
Writeln('Возраст');
Readln (DD);
if DD <> 0 then RR.ago:=DD;
И опять берём позицию записи и записываем запись на место.


Только вот делать редакторы в консоли - убийство.

Добавлено через 7 минут
У вас должно быть общее меню.
1 Создать
2 Редактировать
3 Выход

Delphi
1
2
3
4
5
6
Writeln('1 Создать');
Writeln('2 Редактировать');
Writeln('3 Выход');
Writeln('----------------');
Write('Выбор? ');
Readln(V);
Добавлено через 1 минуту
Ну далее можно через Case
Вы меня немного не поняли) Меня интересует не эта часть, а часть с перезаписью в файле, т.е. тот момент, когда мы будем изменять эту самую запись в файле.

или этот блок
Delphi
1
2
3
4
5
6
Writeln('Имя');
Readln (SS);
if SS <>'' then RR.Name;
Writeln('Возраст');
Readln (DD);
if DD <> 0 then RR.ago:=DD;
уже изменяет саму запись в файле?
0
Lirrk
Заблокирован
20.10.2013, 22:34 7
Нет, Этот блок не изменяет.
1
Lerby
4 / 4 / 0
Регистрация: 30.05.2013
Сообщений: 61
20.10.2013, 22:39  [ТС] 8
Цитата Сообщение от Lirrk Посмотреть сообщение
Нет, Этот блок не изменяет.
то то я и думаю что странно) вроде как не должен)
у меня именно с этим проблема - убрать/отредактировать типизированный файл без перезаписи.
мы запись то найдем, но она не изменится.

Есть конечно вариант, как выше отметили, отмечать её как удаленную и просто оставить там висеть, но не знаю на сколько это будет хорошо, по этому пока придерживаюсь изначальной цели - узнать, можно ли отредактировать файл, например, в середине (т.е. что то надо будет удалить, а что то добавить) без перезаписи.
0
Lirrk
Заблокирован
20.10.2013, 22:57 9
Мне кажется тут всё что вам нужно
http://www.win-ni.narod.ru/FPC/prog_6_3.htm

Добавлено через 9 минут
а вообще
Файл типизированный
Nomer - номер записи в файле
поскольку счёт с нуля значит -1

Delphi
1
2
3
4
5
6
7
8
  //Тут нужно задать номер последней записи
  Nomer:=.................
  seek(FA,Nomer-1);//установили позицию
  read(FA,RR);//Прочитали
  //Тут задаём номер уничтожаемой записи
  Nomer:=.................
  seek(FA,Nomer-1);//установили позицию
  write(FA,RR);//Записали
Добавлено через 4 минуты
Ну а далее там примеры вверху. Нужно встать на последнюю запись и обрезать по ней файл. Потом файл закрыть

Добавлено через 2 минуты
а то. что я написал, редактирование.
Впрочем по ссылке. то что у вас должно получится. С меню редактором и так далее.
1
20.10.2013, 22:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2013, 22:57

Удаление строки из типизированного файла в StringGrid-е
Здравствуйте. Подскажите пожалуйста, где ошибка... Процедура должна удалить...

Удаление данных из типизированного файла по условию
Всем привет!Такой вопрос, мне нужно удалять данные за промежуток времени...

Удаление текущей записи из файла
Добрый день. Имеется файл, выведенный в СтрингГрид. Нужно осуществить...


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

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

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