Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Лабораторная работа №7 - файл 1.doc


Лабораторная работа №7
скачать (48.5 kb.)

Доступные файлы (1):

1.doc49kb.18.12.2011 17:10скачать

содержание
Загрузка...

1.doc

Реклама MarketGid:
Загрузка...
«ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ»

ЛАБОРАТОРНАЯ РАБОТА №7

«Файловая система Visual Prolog и обработка строк»

Теория:

Обычно файлом называют именованную (то есть имеющую имя) совокупность данных, записанных на диске. Файл состоит из компонентов (элементов). При чтении или записи файловая переменная перемещается к очередному компоненту и делает его доступным для обработки.
Для работы с файлом используют следующие встроенные предикаты:

FILEPOS(X,Y,Z)

Содержимое файла можно рассматривать как поток компонентов. Каждый компонент файла находится на какой-то позиции. Для того чтобы узнать текущую позицию чтения или записи в файле, либо для того, чтобы изменить эту позицию, служит предикат filepos.

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

Номер режима может принимать одно из трех значений: ноль, единица или двойка.

Если он равен нулю, то позиция считается от начала файла. Если он равен единице, позиция отсчитывается от текущей позиции. Этот режим имеет смысл только при означенном втором аргументе, когда предикат используется для изменения текущей позиции. Потому что если второй аргумент предиката не был означен, а третий аргумент равен единице, то во второй аргумент будет помещен ноль. Смещение текущей позиции чтения или записи в файле относительно текущей позиции, естественно, равно нулю. Если же третий аргумент равен двойке, то позиция отсчитывается от конца файла.

Предикат может быть использован двояко. Если все три его аргумента связаны, то позиция, из которой осуществляется чтение или в которую производится запись, будет изменена в соответствии с числом, которым означен второй аргумент. Если его второй аргумент свободен, а первый и третий связаны, то второй аргумент будет означен текущей позицией чтения или записи.

FILE_STR(X,Y)

Целиком читает символы файла Х в строку Y или, наоборот, записывает содержимое строки в файл, в зависимости от того, свободен ли второй параметр этого предиката. Первым входным параметром этого предиката является символическое имя файла, а вторым — строка, в которую считывается содержимое файла или из которой записывается информация в него.

EOF(X)

(сокращение от End Of File — "конец файла") успешен, если достигнут конец файла, в противном случае он неуспешен. В качестве его единственного входного параметра указывается символическое имя файла. Он обычно используется при организации рекурсивного считывания всех компонентов файла. Если его попытаться применить к файлу, открытому на запись, будет выдано сообщение об ошибке.

Содержимое файла можно рассматривать как поток компонентов. Каждый компонент файла находится на какой-то позиции.

FLUSH(X)

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

DELETEFILE()

удаляет файл, указанный в качестве его единственного параметра. Если по какой-то причине удалить файл не получается, этот предикат выдает сообщение об ошибке.
^ Практическое применение:

Создадим предикат, считывающий с клавиатуры символы и помещающий их в файл. При этом набираемые символы на экран не выводятся.

domains

file = myfile

predicates

sozdf

clauses

sozdf :-readchar (X),

X<>'#',!,

write (X),%здесь write выполняет запись символа в файл

sozdf.

sozdf.

goal

write ("Введите символы для записи в файл, окончание ввода - #"),nl,

openwrite (myfile, "c:\\file1.dat" ) ,

writedevice (myfile) ,

sozdf,

closefile (myfile) ,

writedevice (screen) ,

write ("Был создан файл C:\file1.dat") ,

nl.

Чтобы символы отображались, необходимо после ввода символа перенаправить устройство ввода на экран, отобразить символ, а затем опять перенаправить ввод в файл.

Для ввода строк такое дополнение не нужно, т.к. для считывания строк используется встроенный предикат readln, который, считывая строку в переменную, отображает её на экране. Например,

domains

file = myfile

predicates

sozdf

run

clauses

sozdf :-readln (X),!,

write (X),nl,%здесь write выполняет запись строки в файл и запись символа возврата каретки (nl)

sozdf.

sozdf.

run:-write ("Введите строки для записи в файл, окончание ввода - Esc"),nl,

openwrite (myfile, "c:\\file2.dat" ) ,

writedevice (myfile) ,

sozdf,

closefile (myfile) ,

writedevice (screen) ,

write ("Был создан файл C:\file2.dat") ,nl.

goal

run.

Самостоятельное задание:

Создайте предикат, формирующий файл из одной или нескольких строк.

Дополните программу предикатом для вывода исходного и измененного файла на экран. Для этого следует прописать дополнительный предикат для проверки достижения конца файла типа

/*rep генерирует точку возврата пока не будет достигнут конец файла*/

rep.

rep:-not(eof(myfile)),

rep.

А в предикате вывода содержимого файла следует

  • вызвать предикат для проверки достижения конца файла

  • считать строку из файла командой readln

  • вывести её на экран командой write

  • добавить в качестве последней подцели предикат неудачного завершения fail.

Примечание: не забудьте при вызове предиката вывода в главном предикате (в примере это run) сначала открыть файл для чтения командой openread и перенаправить устройство чтения на файл командой readdevice


Скачать файл (48.5 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru