Составьте программу, удаляющую заданный файл из текущего каталога.
3. Составьте программу переименовывающую заданный файл в текущем каталоге.
4. Напишите программу для удаления произвольной записи из типизированного файла.
5. Добавьте обработку ошибок в программы из листингов 2, 3, 4, а также к программе из
п. 4. задания.
6. В программе из листинга 7 добавьте обработку ошибок при вводе номера пункта
меню (т. е. проверку что ввели число). При неверном вводе пользователю должно быть
предложено повторить ввод.
7. Модифицируйте программу приведенную в листинге 7, добавив следующие функции:
• сортировку по фамилии;
• вывод на экран всех записей относящихся к заданной группе.
Приложение А – Исходный текст модуля
uStudTable
{
список студентов на основе типизированного файла
}
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
| {$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
unit uStudTable;
interface
//коды ошибок
const errNoError=0; //нет ошибок
errRecNotFound=-1; //запись не найдена
errFileError=-2; //ошибка ввода вывода
type TStudent=record
active :Boolean; //флаг удаления записей
name :string[12]; //имя
familia:string[16]; //фамилия
gruppa :Integer; //группа
end;
{открывает файл таблицы
ВХОД
ATableName - имя файла таблицы
newcreate - задает поведение при отсутствии файла
True - если файл таблицы не существует, то он создается
False - если файл таблицы не существует, то он не создается
ВЫХОД
код ошибки}
function OpenTable(const ATableName:string;
newcreate:boolean):integer;
{закрывает файл таблицы}
procedure CloseTable;
{добавление записи в файл
ВХОД
R - переменная, содержащая добавляемые данные
ВЫХОД
код ошибки}
function AddRecord(const R:TStudent):Integer;
{чтение записи (строки) из таблицы
ВХОД
R - буфер, куда будут помещены прочитанные данные
index - индекс считываемой строки
ВЫХОД
код ошибки}
function ReadRecord(var R:TStudent; index:Integer):Integer;
{запись строки в таблицу
ВХОД
R - буфер, содержащий записываемые данные
index - индекс записываемой строки
ВЫХОД
код ошибки}
function WriteRecord(const R:TStudent; index:Integer):Integer;
{удаление строки из таблицы
ВХОД
index - индекс удаляемой записи
ВЫХОД
код ошибки}
function DeleteRecord(index:Integer):Integer;
{поиск записи в таблице, по столбцу "фамилия"
ВХОД
AValue - строка для поиска
ВЫХОД
индекс искомой строки (записи) таблицы или код ошибки}
function FindRecordByFamilia(const AValue:String):Integer;
{удаление всех записей из таблицы помеченных как удаленные
ВЫХОД
код ошибки}
function CompressTable:Integer;
{возвращает число записей (строк в таблице)
ВЫХОД
число записей в файле или код ошибки}
function RecordCount:Integer;
implementation
var StudList:file of TStudent; //файл таблицы
function OpenTable(const AtableName:string;
newcreate:boolean):integer;
var error:Integer;
begin
AssignFile(StudList, ATableName);
{$I-}
Reset(StudList);
error:=IOResult;
if (error<>0)and(newcreate) then Rewrite(StudList);
error:=IOResult;
{$I+}
if error<>0 then Result:=errFileError else Result:=errNoError;
end;{OpenTable}
procedure CloseTable;
begin
CloseFile(StudList);
end;{CloseTable}
function RecordCount:Integer;
var error:Integer;
begin
{$I-}
Result:=FileSize(StudList);
error:=IOResult;
if error<>0 then Result:=errFileError;
{$I+}
end;{RecordCount}
//добавление записи в конец файла
function AddRecord(const R:TStudent):Integer;
begin
{$I-}
Seek(StudList, FileSize(StudList));
write(StudList, R);
if IOResult<>0 then Result:=errFileError else Result:=errNoError;
{$I+}
end;{AddRecord}
function ReadRecord(var R:TStudent; index:Integer):Integer;
begin
{$I-}
Seek(StudList, index);
read(StudList, R);
if IOResult<>0 the
end;
if error<>0 then Result:=errFileError //произошла ошибка IO
else if found then begin
Result:=Filepos(StudList)-1; //элемент был найден (возвращаем
индекс элемента)
if IOResult<>0 then Result:=errFileError; //произошла ошибка IO
end
else Result:=errRecNotFound; //элемент не найден
{$I+}
end;{FindRecordByFamilia}
function CompressTable:Integer;
var stride, count, i, error:integer;
buf:TStudent;
begin
i:=0;
stride:=0;
{$I-}
count:=filesize(StudList);
error:=IOResult;
while (i<count)and(error=0) do begin
seek(StudList, i);
read(StudList, buf);
error:=IOResult;
if error=0 then begin
if buf.active then
if stride<>0 then begin
seek(StudList, i-stride);
write(StudList, buf);
error:=IOResult;
end else
else Inc(stride);
inc(i);
end;{if}
end;{while}
//определем результат завершения цикла
if error=0 then begin
seek(StudList, count - stride);
truncate(StudList);
if IOResult<>0 then Result:=errFileError
else Result:=errNoError;
end
else Result:=errFileError;
{$I+}
end;{CompressTable}
end. |
|
Приложение Б – Блок-схема алгоритма процедуры
CompressTable
Рисунок 4 – Блок схема процедуры CompressTable