Работа с файлами

/* telefon book + file */

trace

domains

name,adr= string

datad=c(name,adr)

file=d

predicates

person(name,adr)

getdata(file)

clauses

person(Im,Adr):-

openread(d,"Telefons"),

readdevice(d),

getdata(d),

readterm(datad,c(Im,Tel)),

closefile(d).

getdata(_).

getdata(Fajl):-

not(eof(Fajl)),

getdata(Fajl).

goal

clearwindow,

person("Bond",Tel),

write(Tel).

 

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

 

Фаил данных

c("АААААА","65_55_35").

c("ББББ","23_37_24").

c("Bretski","98-12-16").

c("Bond","21-07-79").

c("ММММ","62_13_06").

2.2.3. Операции чтения

 

readdevice(символ_имя)

(file):(i)(o)

 

Символическим именем устанавливается (1) текущее устройство

чтения, в случае (о) возвращается его символическое имя. По

умолчанию действует readdevice(keyboard), то есть чтение с

клавиатуры. Если указывается символическое имя файла, то этот

файл должен быть открытым на чтение или модификацию.

 

readint(целое)

 

(integer):(о)

 

Читает целое число с текущего устройства чтения. Чтение

заканчивается с помощью <ВК>.

 

readrea(действительное)

(real):(о)

 

Читает действительное число с текущего устройства чтения. Чтение

заканчивается с помощью <ВК>.

 

readchar(знак)

 

(char): (о)

 

Читает отдельный знак с текущего устройства чтения, причем все

знаки равноправны (то есть читаются также управляющие символы).

 

readln(строка)

 

(string):(о)

 

Читает знаки с текущего устройства чтения. Конец чтения с

помощью <ВК>.

 

file_str(имя_файла,строка)

(string,string): (i,o)(i,i)

 

Читает (i,o) знаки (до 64 Кбайт) из файла с дискеты, имя

которого указано, в строку. Чтение прекращается, когда

встретится признак конца файла (CTRL/Z). В случае (i,i) cтрока

записывается в файл.

 

readterm(область,терм)

 

(имя области определения,терм области):(i,о)

 

Читает после открытия файла факты из файла. Область определения

- это область, как она указывается в секции domains, а терм

области - это терм, который соответствует такой области.

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

файле DATA. DAT:

 

содержимое файла DATA. DAT:

 

р("Вяад","Киев"). р("Карен","Ильменау").

р("Хайди","Браззавиль"). р( "Федя","Магадан").

 

domains

 

name.adress = string

datadoinain = p(name,adress)

file =d

predicates

person(name,adress)

getdata(file)

clauses

 

person(Imj a,Adres): -

openread(d,"data. dat"),

readdevice(d),

getdata(d), .

readterm(datadomain,p(Imja,Adres)),

closefile(d).

getdata( _ ).

getdata(Fajl):-

not(eof(Fajl)),

getdata(Fajl).

goal

clearwindow,

person("Хайди",Adres),

write(Adres).

 

При этом предикат getdata нужен для того, чтобы поиск в базах

данных продолжался, пока не найдено то, что указано в цели (то

есть предикат используется в качестве точки решения для

возврата).

 

inkey(знак)

 

(char): (о)

 

Заканчивается удачей, если после предыдущей операции чтения была

нажата клавиша. Тогда возвращается ее код. Если не 'было нажатой

клавиши, то предикат заканчивается неудачей.

Например, рисовать окружность, пока не нажата любая клавиша:

 

predicates

kreis

clauses

kreis:-

inkey(_).

kreis: -

forward(100),right(l),kreis.

goal .

graphics(2,l,7).kreis.

 

Операции записи

 

writedevice(симвод_имя)

(file): (i),(о)

 

Устанавливает (i) символическим именем текущее устройство

записи. В случае (о) возвращается символическое имя текущего

устройства записи. Предопределены символические имена screen

(экран, действует по умолчанию), printer (печатающее

устройство), сопи (серийный интерфейс). Если указывается

символическое имя файла, то этот файл должен быть открытым на

запись или модификацию.

 

nl

 

Выдает на текущем устройстве возврат каретки и перевод строки

(<ВК><ПС)). Другим способом выдачи <ВК><ПС> является write('n'^)

или write("10").

 

write(Xl,X2,...)

 

(переменные и константы): (i,i,...)

 

Выдает на текущем устройстве записи константы и содержимое

переменных. Если в строке указана обратная косая "", то

последующие три цифры принимаются как ASCII-код одного знака,

который выводится.

Короткие примеры:

 

goal

 

write("123abc"), /* пишет 123abc , нету ""t */

 

write("abc1234"), /* пишет abc{4 , "123=АSСП-код для { */

 

wrtte("abcnl23"), /* пишет abc */

/* 123 -*/

/* пишет abc */

write("abc10123"), /* 123 , 010=<ВК><ПС> */

 

write("abc10xl23"). /* пишет abc */

/* х123 , 010°<ВК><ПС> */

/* х как ограничитель */

 

 

writef(формат_строка,XI,Х2,...)

(string.nepеменные и константы): (i, i, i,...)

 

Форматный вывод констант и содержимого переменных. В

формат_строке указываются печатаемые знаки определявшие форматы

вывода. Форматы даются в следующем виде:

 

"X-m.pw"

 

где % - признак форматного вывода;

 

- - (опция) если указан, то знаки в поле вывода будут

выравниваться по левому краю, если нет - по правому;

 

m - (опция) указывает длину поля вывода;

 

р - (опция) при выводе чисел указывает количество цифр после

десятичной точки;

 

w - (опция) указывает нотацию чисел, причем здесь могут

записаться следующие буквы:

 

f - действительное число в десятичном виде (действует по

умолчанию);

 

е - действительное число в экспоненциальном виде;

 

g - использование самого короткого формата.

 

Например:

 

write("привет") привет

 

writef("X6","привет") привет.

 

witef("X8","привет") привет

 

writef("X8.1",123.89) 123. 9

 

wrltef("X8.1e",123.89) 1.2Е+02

 

writef("Xe",123.89) 1.2389E+02

 

writef("это числа %I и %4.1, а также %-10el",X,Y,Z)

где Х - 1.0, Y - 3.37, Z » 4.5 выводит:

 

это числа 1 и 3. 4, а также 4.5Е+00 I

 

Работа с файлами

 

disk( маршрут)

(string):(l)(o)

 

Устанавливает (i) иди возвращает (о) текущий дисковод и подкаталог.

 

Например, читать файл по указанным дисководу, маршруту и имени

файла, и вывести его:

 

goal

clearwindow,

write("дисковод (N:): "),readln(D),

write("маршрут: "),readln(M),

concat(D,M,S),

disk(S),

writе("файл - имя.тип: "),readln(Fajl),

file_str(FaJl,Str),

makewindow(l,7,0,"",0,0,25,80),

write(Str),readchar(_).

 

existfile(имя_фaйлa) .

(string) :(i)

 

Истинно, если в текущем каталоге существует файл с указанным

именем.

 

openwrite(символ_имя,имя_файла)

(file,string): (i,l)

 

Открывает файл с указанным именем для операции записи и

связывает этот файл с символическим именем для дальнейшей работы

с ним. Если указанный файл уже существует, то он убирается.

Предопределенными символическими именами являются printer

(паралельный интерфейс), screen, keyboard, com1 (серийнный

интерфейс). Их открывать не нужно.

 

openread(символ_имя,имя_файла)

 

(file,string):(i,i)

Открывает файл для операции чтения (см. также openwrite).

 

openmodify(симвод_имя,имя^файла)

(file,,striner):(i,i)

 

Открывает файл для операции записи и чтения. Может быть

использован вместе с предикатом filepos (см. ниже), чтобы

актуализировать файлы с прямым доступом (см. также openwrite),

 

openappend(символ_имя, имя_файда)

(file,string): (i,i)

 

Открывает файл для дописывания (см. также openvrite). .

 

closefilе(символ__имя).

(file):(i)

 

Закрывает файл с указанным символическим именем. Истинно также,

если файл не был открыт.

 

eof(символ_имя)

(file).:(i)

 

Истинно; если указатель файловой позиции указывает на конец

файла.

 

filepos( символ_имя, позиция, режим)

(file,real,integer): (i,i,i),( i,o,i)

 

В случае (i,i,i) в зависимости от режима устанавливается в

указанном символическим именем файле знаковая позиция, с которой

продолжаются операции чтения или записи. Модуль определяется по

следующей таблице:

 

ружим Знаковая позиция
Относительно начала файла; первый знак имеет позиции 0
Относительно текущей позиции,ее знак имеет позицию 0
Относительно конца файла; последний знак имеет позицию 0

 

Например в новом файле после write("0l23n") указатель позиции

равен 6 (относительно начала файла). Это можно иллюстрировать

так:

 

знак 0 1 2 3 <ВК> <ПС>

позиция 0 1 2 3 4 5 6

 

 

В случае (i,o,i) возвращается позиция относительно начала

(только!) файла.

 

Еще пример: писать два слова в файл, и в диалоге показать

десятичный ASCII-код по указанной позиции (конец при позиции -1,

или при позиции, большей максимальной):

 

После записи слов имеется следующая структура в файле:

 

с л о в о 1 <ВК> <ПС> с л о в о 2 <ВК> <ПС!>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

 

domains file=f

predicates dwa_slowa dialog ;

goal

clearwindow,

dwa_slowa,

openread(f,"test"),

dialog, .

closeflle(f).

clauses

dwa_slowa: -

openwrite(f,"test"),

writedevice(f),

write("cлово1nслово2n),

closefile(f),

writedevice(screen).

dialog: -

readdevice(keyboard),nl,

write("номер позиции: "),readreal(X),X<>-l,

readdevice(f),

filepos(f,X,0),readchar(Y).

char_int(Y, Z),

. wite(Z)," "),

dialog.

dialog.

 

flush(символ_имя)

(file):(i).

 

Пишет содержимое внутреннего буфера файла на текущее устройство

записи (обычно это происходит автоматически), например, при

выводе на серийный интерфейс.

 

геnаmе(имя1,имя2)

(string,string): (i,i)

Файл с указанным именем переименуется в имя2.

 

deletefile(имя)

(string)

 

Файл с указанным именем убирается с дискеты.