Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

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

В этом разделе мы опишем носколько других предикатов для работы с

файлами. Это предикаты filepos, eof, flush, existfile, deletefile,

renamefile и disk.

Предикат filepos может управлять позицией, где производится чтение

или запись. Он имеет формат:

filepos (SymbolicFileName, FilePosition, Mode) /* (i,i,i),

(i,o,i) */

Если FilePosition - связанная переменная, предикат может изменить

позицию чтения и записи для файла. Если при вызове FilePosition является

свободной переменной, то SymbolicFileName возвращает текущую позицию в

файле.

FilePosition дожно иметь вещественное значение (любая дробная часть

игнорируется).

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

ваться (согласно таблице 12.1.) значение FilePosition.

Таблица 12.1 Mode и FilePosition

--------------------------------------------------

Mode FilePosition

--------------------------------------------------

0 Относительно начала файла.

1 Относительно текущей позиции.

2 Относительно конца файла. (Конец файла

соответствует позиции 0.)

--------------------------------------------------

Когда возвращается FilePosition, filepos возвращает позицию относи-

тельно начала файла.

Замечание: При использовании filepos, новая строка в файле

считается как два символа.

Примеры

Следующая последовательность запишет значение Text в файл

SOMEFILE.PRO (к которому Пролог обращается, как к myfile), начиная с по-

зиции 100 (относительно начала файла).

Text = "A text to be written in the file",

openmodify(myfile,"somefile.pro")

writedevice (myfile),

filepos(myfile,100,0),

write(Text).

Используя filepos, можно проверить содержимое файла байт за байтом,

как это сделано в программе CH12EX10.PRO. Эта программа запрашивает имя

файла, затем показывает содержимое позиций файла, причем номера позиций

вводятся клавиатуры.

/* Program CH12EX10.PRO */

domains

file = input

predicates

inspect_positions

goal

write("Which file do you want to work with?"),

readln(FileName),

openread(input,FileName),

inspect_positions.

clauses

inspect_position :-

readdevice(keyboard),

nl,write("Position No? "),

readreal(X),

readdevice(input),filepos(input,X,O),

readchar(Y),write("Char is:",Y),

inspect_positions.

Предикат eof/1

Предикат eof проверяет является ли позиция, полученная в процессе

чтения, концом файла. В этом случае eof успешна. В противном случае он

терпит неудачу. eof имеет вид:

eof (SymbolicFileName) /* (i) */

Пример

Предикат eof можно использовать для определения предиката repfile,

который полезен при работе с файлами. repfile генерирует точку возврата

до тех пор, пока не будет достигнут конец файла.

predicates

repfile(FILE)

clauses

repfile(_).

repfile(F):-not(eof(F)(),repfile(F).

Следующая программа преобразует один файл в другой, все буквы кото-

рого являются прописными.

/* Program CH12EX11.PRO */

domains

file = input; output

predicates

convertfille

repfile(FILE)

goal

write(Which file do you want convert ?"),

readln(InputFileName),

write(What is the name of the output file/"),

readln(OutputFileName),

openread (input,InputFileName),

readdevice(input),

openwrite (output,OutputFileName),

writedevice(output),

convertfile,

closefile(input),

closefile(output).

clauses

convertfile:-

repfile(input),

readln(Ln),

upper_lower(LnInUpper,Ln), /* перевод букв строки

в заглавные */

write(LnInUpper),nl,

fail.

convertfile.

repfile(_)

repfile(F):-not(eof(F),repfile(F).

Соседние файлы в папке Документация