Помощь - Поиск - Пользователи - Календарь
Полная версия: типизированные файлы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Athen
Разработать программу для обработки данных типизированного файла. Обработка данных должна включать процедуры без параметров:
Для вывода шапки таблицы;
Для вывода данных одной записи;
Для создания файла;
Для дополнения файла новыми записями;
Для записи данных в файл;
для записи данных файла;
Для чтения данных файла;
Для модификации ряда записей файла;
Для поиска записей файла с выводом найденных записей или сообщения о неуспешном поиске по поисковому признаку;
Удаления записей из типизированного файла следующим образом: поиск удаляемой записи; сдвиг (в случае успешного поиска) всех записей, расположенных после удаляемой записи, к началу файла; после удаления производится усечение файла.
Структура файла:
Абонентская плата за телефон
Ф.И.О. абонента Телефон Год установки Количество абонентов Плата за телефон

Поисковые признаки: абоненты, имеющие задолженность; год установки до 1980 года.


Начала делать так: ток чет ниче не выходит, кроме шапки таблицы unsure.gif dry.gif

Program zadacha2;
Uses crt;
procedure tabl;
begin
writeln('abonentskaya plata za telefon­');
writeln(' ----------------------------------------------------------------- ');
writeln('| FIO | telefon­ | god | kolichestvo | plata za  |');
writeln('| abonenta  | | ystanovki | abonentov | telefon ­ |');
writeln(' ----------------------------------------------------------------- ');
end;
procedure danzap;
type str=record
FIO:string[30];
tel:longint;
god:integer;
kab:integer;
plt:integer;
end;
const name:string='H:\Program Files\TurboPascal7.1\« Ў  ь4\2.dat';
var p:char;t:str; f:text;
begin
Assign(f,name);
Reset(f);
readln(f,t.FIO,p,t.tel,t.god,t.kab,t.plt);
Close(f);
end;
procedure sozd;
var f:file;
begin
Assign(f,'2.dat');
Rewrite(f);
Close(f);
end;
procedure dop;
var f:text; a:string;
begin
Assign(f,'3.dat');
Append(f);
writeln('dopolnite file');
read(a);
Close(f);
end;
procedure zap;
var f:text; a:string;
begin
Assign(f,'2.dat');
Rewrite(f); Reset(f);
writeln('Vvedite dannue');
readln(f,a);
Close(f);
end;
procedure cht;
var f:text; a,b:string;
begin
Assign(f,'2.dat');
Reset(f);
Write(f);
close(f);
end;
Var f:text; a:string;
Begin
Clrscr;
tabl;
danzap;
sozd;
dop;
zap;
cht;
readln;
End.

мисс_граффити
ну, во-первых, по-моему, имеет смысл сделать тип str доступным по все программе, а не только в danzap
далее
Цитата
Для вывода шапки таблицы;

это ты сделала
Цитата
Для вывода данных одной записи;

procedure danzap;
const name:string='H:\Program Files\TurboPascal7.1\« Ў ь4\2.dat';
var p:char;t:str; f: file of str;
begin
Assign(f,name);
Reset(f);
read(f,t);
write(t.FIO,' ',t.tel); {здесь же можешь вывести и остальные поля - просто не стала набирать их}
Close(f);
end;

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

Цитата
Для создания файла;

Ты сделала.

Цитата
Для дополнения файла новыми записями;

А зачем ты делаешь а строкой?! Файл же типизированный, пишем в него записи. Вот с записями и работай.
Только не забывай перемещать указатель в конец файл с помощью seek - а то запишешь поверх другой записи.

..продолжение следует.
пока разберись с этим
Athen
Спасибо за ответ!
Я кое-что исправила
procedure zap;
var f:text; a:str; p:char;
begin
Assign(f,'2.dat');
Rewrite(f); Reset(f);
p:=' ';
writeln('Vvedite dannue');
read(a.FIO,p,a.tel,p,a.god,p,a.kab,p,a.plt);
Close(f);
end;


procedure danzap;
var p:char;t:str; f:text;
begin
Assign(f,'2.dat');
Reset(f); p:=' ';
read(f,t.FIO,p,t.tel,p,t.god,p,t.kab,p,t.plt);
write(t.FIO,p,t.tel,p,t.god,p,t.kab,p,t.plt);
Close(f);
end;

Пришлось в read перечислить все записи, иначе выдает ошибку.

Но похоже заполнение программа не принимает, потому что выходят стрелки и нули.

насчет seek... написала так: seek(f,filesize(f)). Но пишет, что файловый тип не правильный.

Переделала чтение файла:
procedure cht;
var f:text; a,b:str; p:char;
begin
Assign(f,'2.dat');
Reset(f);
p:=' ';
Repeat
Read(f,a.FIO,p,a.tel,p,a.god,p,a.kab,p,a.plt);
write(a.FIO,p,a.tel,p,a.god,p,a.kab,p,a.plt);
until Eof(f);
close(f);
end;

Вроде бы правильно читает
Tan
f : file of str, если ты работаешь с записями в файле.
Athen
Цитата(Tan @ 6.05.2007 21:03) *

f : file of str, если ты работаешь с записями в файле.


Тогда он в Append(f) пишет, что не правильный формат...
Файл же состоит не только из записей, но и из пробелов
volvo
Цитата
Тогда он в Append(f) пишет, что не правильный формат...
Проблема не в этом... Проблема здесь - в том, что Append вообще неприменима к типизированному файлу - только к текстовому...

Зачем вообще Append? Все и без него прекрасно реализуется:
Seek(f, FileSize(f));

и следующая операция Write(f, ...) запишет компоненту в конец файла...
Tan
Если задание на типизированные файла, то в твоём случае там должны быть только записи, зачем пробелы ? Ты должен читать всю запись сразу, а не пытаться прочитать её поле определённого типа, то есть нельзя просто не обратившись к записи читать что - то другое (на будущее).
Athen
А теперь выдает ошибку чтения диска...
procedure cht;
var f:file of str; a,b:str; p:char;
begin
Assign(f,'2.dat');
Reset(f);
p:=' ';
Repeat
Read(f,a);
write(f,a);
until Eof(f);
close(f);
end;

А когда начинаешь дополнять запись, то вместо фамилии запришивает номер
уфф.... да уж...
мисс_граффити
Цитата
Read(f,a);
write(f,a);

это что за деятельность? считали запись и сразу пишем ее на место следующей?
а зачем?
так с eof неизвестно что будет твориться...
Athen
Я пытаюсь разобраться, даже что-то уже получается, только вот не могу понять чем ему не нравится
read(f,a);
пишет: Error 100: Disk read error.
По книжке хорошей посмотрела, там тоже так же написано: read(f,z); z-тоже запись
странно...
мисс_граффити
Возможно, файл не открыт.
Или ты читала-читала, а он закончился.

Если ты про эту процедуру - обрати внимание на мое прошлое замечание.
Athen
Цитата(мисс_граффити @ 9.05.2007 17:21) *

Возможно, файл не открыт.
Или ты читала-читала, а он закончился.

Если ты про эту процедуру - обрати внимание на мое прошлое замечание.

Да, я исправила это...
когда я заполняю файл, после последнего ввода, как нажимаю Enter, сразу прога заканчивается и выдает ошибку чтения диска.... никак не могу исправить
мисс_граффити
выложи, как на данный момент выглядит твоя прога. можно прикрепить pas-файл
Athen
Вот: вроде с диском исправила, осталось только поправить косяки с процедурой modif и понять, почему если вводишь не 1 запись, а две, то читает только последнюю!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.