Процедура writedict имеет два параметра, имя входного файла и адрес массива структур dict_elem. Предполагается, что этот список заканчивается первой структурой массива, в которой элемент d_length равен нулю.
{$i dict.inc}
function writedict (const dictname:pchar; elist:pdict_elem):integer;
var
j:integer;
outf:pfile;
begin
(* Открыть входной файл *)
outf := fopen (dictname, 'w');
if outf = nil then
begin
writedict:=ERROR;
exit;
end;
(* Вычислить размер массива *)
j:=0;
while elist[j].d_length <> 0 do
inc(j);
(* Записать список структур dict_elem *)
if fwrite (elist, sizeof (dict_elem), j, outf) < j then
begin
fclose (outf);
writedict:=ERROR;
exit;
end;
fclose (outf);
writedict:=SUCCESS;
end;
Обратите внимание на использование sizeof(dict_elem) для сообщения процедуре fwrite размера структуры dict_elem в байтах.
Процедура readdict использует процедуру fread для считывания списка структур из файла. Она имеет три параметра: указатель на имя файла словаря indictname, указатель inlist на массив структур dict_elem, в который будет загружен список структур из файла, и размер массива maxlength.
function readdict (const indictname:pchar;inlist:pdict_elem;
maxlength:integer):pdict_elem;
var
i:integer;
inf:pfile;
begin
(* Открыть входной файл *)
inf := fopen (indictname, 'r');
if inf = nil then
begin
readdict:=nil;
exit;
end;
(* Считать структуры dict_elem из файла *)
for i:=0 to maxlength - 1 do
if fread (@inlist[i], sizeof (dict_elem), 1, inf) < 1 then
break;
fclose (inf);
(* Обозначить конец списка *)
inlist[i].d_length := 0;
(* Вернуть начало списка *)
readdict:=inlist;
end;
const
delem1:array [0..1] of dict_elem=(
(d_name:('d','n','a','m','e', #0,#0,#0,#0,#0,#0,#0,#0,#0,#0);
d_start:2; d_length:15; d_type:3),
(d_name:(#0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0)