IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> удаление в типиз. типах, по номеру записи
kr3v3tkus
сообщение 14.03.2006 23:51
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


задача:
1 Открыть файл
2 Добавить запись
3 Изменить запись по номеру
4 Удалить запись по номеру
5 Распечатать построчно
6 Выйти

Проблема с 4 пунктом. Препод сказал сделать так - узнать номер строки, создать новый файл и перенести туда все строки кроме этой, потом - переименовать новый файл в старый. Подскажите плз как сделать, а уж с 5 и 6( smile.gif ) я сам разберусь yes2.gif

program lol;
uses crt;
label metka1, metka2;
type Pprice=record
Pname:string[20];
Pvalue:real;
end;
var price:file of Pprice;
p:pprice;
i,n,z,x:integer;
procedure vivod;
begin
reset(price);
while not eof(price) do
begin
read(price,p);
write(p.pname:10);
writeln(p.pvalue:10:2);
writeln;
end;
close(price);
end;

begin
clrscr;
begin {' otkritie '}
assign(price,'C:\price.dat');
write('noviy file - 0, redakt - 1 ');
readln(i);
if i=0 then rewrite(price) else reset(price);
end;

begin {' dobavlenie '}
write('dobavit? da - 1, net - 0 ');
readln(n);
if n=1 then
begin
metka1:
seek(price,filesize(price));
write('vvedite na3vanie tovara ');
read(p.pname);
write('vvedite na3vanie ceni ');
read(p.pvalue);
write(price,p);
write('dobavit? da - 1, net - 0 ');
readln(n);
if n=1 then goto metka1;
end;
close(price);
end;

vivod;

begin {' i3menenie '}
reset(price);
metka2:
write('vvedite nomer stroki dlia i3meneniya ');
readln(i);
seek(price,i-1);
write('vvedite na3vanie tovara ');
read(p.pname);
write('vvedite na3vanie ceni ');
read(p.pvalue);
write(price,p);
write('eshe redaktirovat? da - 1, net - 0 ');
readln(n);
if n=1 then goto metka2;
close(price);
end;

vivod;

begin {' ydalenie '}
write('vvedite nomer stroki dlia ydaleniya ');
readln(i);
??? sad.gif
end;

readln;
end.


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.03.2006 0:07
Сообщение #2


Гость






Цитата
Препод сказал сделать так - узнать номер строки, создать новый файл и перенести туда все строки кроме этой
Бред... Нет в типизированном файле такого понятия, как строка, можешь своему преподу прямо так и сказать...

Все, что могу предложить:
const
old_name = 'old.dat';
new_name = 'new.dat';

...
{ здесь - создаешь новый файл new_file }
...
while not eof(old_file) do begin
read(old_file, r); { ичтаем запись }
if { какое-то условие, при выполнении которого запись НУЖНО переносить }
then write(new_file, r);
end;

close(new_file); close(old_file);
erase(old_file);
rename(new_file, old_name);

Учти, что после этого надо будет заново делать Assign для old_file, если захочешь с ним работать...
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 15.03.2006 0:28
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


2 volvo:
пардон, мой косяк спешил и описа'лся , я имелл ввиду конкретную запись а не строку smile.gif
только я не совсем понял в этом коде

Цитата
read(old_file, r);
if { какое-то условие}
then write(new_file, r);


он копирует из старого файла запись в новый, и, если нам, например, нужно убрать 3ю запись, то мы в if пишем условие, чтоб 3я не копировалась? (пардон ещё раз, не оч с темой разобрался)


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.03.2006 0:33
Сообщение #4


Гость






Цитата
он копирует из старого файла запись в новый, и, если нам, например, нужно убрать 3ю запись, то мы в if пишем условие, чтоб 3я не копировалась?
yes2.gif Именно так и пишешь:
  if filepos(old_file) <> 3 
then write(new_file, r);
Третья запись (отсчет начинается с 1-цы) перенесена в новый файл не будет...
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 15.03.2006 1:06
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


Пасибоньки smile.gif в который раз... smile.gif


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 15.03.2006 9:22
Сообщение #6


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


основа такая же, но маленькое дополнение внесу.

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 15.03.2006 9:27
Сообщение #7


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


И зачем хранить совершенно лишнюю и не нужную информацию ? Если может потребоваться за один раз удалить только одну запись ? (это достаточно четко понятно по заданию)

Единственное что могу предложить для удобства работы с базой (чтобы постоянно не обращаться к файлу) в начале работы сохранть записи в массиве и работать с ним до завершения программы, преде самым ее концом перезаписав элементы массива в файл.

Сообщение отредактировано: klem4 - 15.03.2006 9:30


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.03.2006 11:12
Сообщение #8


Гость






Цитата(мисс_граффити @ 15.03.2006 8:22) *
можно в саму запись добавить одно поле логического типа. везде написать true.
и когда мы знаем, какие записи удалить - проставить в них false.
это позволит за один проход удалять сколько угодно записей.

Логическая неувязочка... no1.gif Если мы знаем, когда ставить True, а когда False, то что нам мешает подставить условие, это определяющее, в предложенный мной алгоритм? Функциональность - та же, лишние данные не используются и не хранятся в базе...
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 15.03.2006 11:14
Сообщение #9


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


всегда надо удалять только одну запись?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.03.2006 11:18
Сообщение #10


Гость






мисс_граффити, давай ты будешь ВНИМАТЕЛЬНО читать то, что здесь пишут? mad.gif КАКАЯ разница, объясни мне, ламеру, будешь ты хранить поле, которое может содержать True/False или напишешь функцию, которая будет сразу определять, удалять запись или нет? ОТКУДА True/False браться -то будет ??? С неба? С потолка? Его же найти еще надо !!!

И какая разница, сколько записей удалять?
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 15.03.2006 12:16
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


я конечно извиняюс за свою тупость, но никак не могу исправить ошибку. volvo вот вы писали дат файлы в константах, тогда их можно в варе не использовать? вобщем я описал вот так
Код
type Pprice=record
             Pname:string[20];
             Pvalue:real;
             end;
var price:file of Pprice;
      newprice:file of Pprice;
      p:pprice;

и естественно ничего не пашет dry.gif :
Код
begin  {' otkritie '}
  assign(newprice,'C:\newprice.dat');
  rewrite(newprice);
  assign(price,'C:\price.dat');
  write('noviy file - 0, redakt - 1  ');
  readln(i);
  if i=0 then rewrite(price) else reset(price);
end;

...

begin  {' ydalenie '}
  write('ydaliaem 3apis? da - 1, net - 0  ');
  readln(n);
  if n=1 then
  begin
    metka3:
    write('vvedite nomer stroki dlia ydaleniya  ');
    readln(i);
    while not eof(price) do
      begin
      read(price,p);
      if filepos(price)<>i then write(newprice,p);
      end;
  close(newprice);
  close(price);
  erase(price);
  rename(newprice,price);
  assign(price,'C:\price.dat');
  reset(price);
  write('eshe ydaliaem? da - 1, net - 0  ');
  readln(n);
  if n=1 then goto metka3;
  end;
end;


ошибку пишет вот тут - rename(newprice,price) 67ю


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.03.2006 12:24
Сообщение #12


Гость






Я не говорил тебе переименовывать так:
var
price:file of Pprice;
newprice:file of Pprice;
...
rename(newprice,price);
Это не будет работать... Читай внимательно:
Цитата
const
old_name = 'old.dat'; { Это - СТРОКА, имя файла, а не файл !!! }
new_name = 'new.dat';
...
rename(new_file, old_name);
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 15.03.2006 12:59
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


вроде понял, это просто строка, в которую мы переименовываем, но всё равно теперь при ренейме пишет, что доступ к файлу запрещён mega_chok.gif
чегото я запутался wacko.gif shok.gif


Прикрепленные файлы
Прикрепленный файл  PRICE.PAS ( 2.14 килобайт ) Кол-во скачиваний: 174


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.03.2006 13:32
Сообщение #14


Гость






Не знаю, что у тебя происходит: только что прогнал программу, все нормально удаляется... Ты этот файл, newprice.dat, случайно, не пытался просмотреть как-нибудь? Может, он где-то открыт у тебя, кроме твоей программы? Потому, что ЭТА ошибка - никак с твоей программой не связана. Это ошибка ОС "Нет доступа".

Попробуй удалить этот файл НЕ через программу. Интересно, получится ли?
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 15.03.2006 15:28
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


blink.gif офигеть, а у меня не прёт cray.gif
системой файл не занят, я нигде не открывал его, удаляться - нормально удаляется. Вот типу дал задачку эту надо у него спросить
оффтоп: и ваще енто рок наверна, ща вот в инст приехал, а там с уроков отпросились. А инст на другом краю города, дожд идёт dry.gif . Это походу вселенская чернота какая то molnia.gif


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 16.03.2006 19:47
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


Блин, вобщем сдал я прорамку эту(тока 2 чела удаление наметали(включая меня lol.gif ), и то так не у кого и не заработало, поэтому препод сказал без удаления мутить), а она и там не работает, вернее работает и даже удаляет 1 раз, но во второй упрямицца и не хочет dry.gif вобщем препод сказал типа в отладке надо смотреть, потому что файл занят после 1го удаления, а я не умею unsure.gif .Впринципе то это уже необязательно, но разобраться хочецца, может кто подскажет в чём дело?


Прикрепленные файлы
Прикрепленный файл  PRICE.PAS ( 2.76 килобайт ) Кол-во скачиваний: 169


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
vladivarov
сообщение 9.10.2012 20:37
Сообщение #17


Гость






Да мне кажется, что любой ответ будет являться субъективным. Сколько людей - столько мнений.
На вкус и цвет ...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 27.05.2024 0:32
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"