Практикалық сабақ №12-13

Тақырыбы: Visual Prolog файл жүйесi

Мақсаты:

 

Қысқаша теориялық мағлұмат

Бұл бөлiмде Visual Prolog файл жүйесiн жəне файлдармен айналып тұрған стандартты предикаттарды көрсетіледі. Енгiзу /шығару қайта тағайындалумен – əртүрлi құрылымдарымен енгiзу /шығару тиiмдi байланыс əдiсiмен таныстыру.

Файл жүйесi ептеген ерекшелiктерiмен Visual Prolog əртүрлi нұсқаларында бiрдей жұмыс iстейдi.

Visual Prolog current_read device оқығанның ағымы және жазғанның ағымды құрылымы current_write қолданылады.

Әдеттегідей, оқығанның ағымдағы құрылымы пернетақта болып табылады, ал ағымдағы жазу құрылымы – дисплейдің пердесі. Дегенмен, басқа құрылымдарды тағайындай аласыз. Мысалы, енгізу сыртқы жадта сақталған (мүмкін дискте) файлдан оқыла алады. Тіпті мүмкiн программаны орындағанда ағымдағы енгiзу мен шығару құрылымдарды қайта анықтауға болады. Оқудың жəне жазудың құрылымдарына қолданылғанына қарамай, Visual Prolog программасында оқу мен жазу ұқсас етіледі. Файлға оны ашу керек. Файл:

  • оқу үшін;
  • жазу үшін;
  • қосу үшін;
  • модификация үшін ашылады.

Кез келген əсер ету үшін ашық файл, операция аяқтаудан кейін жабылуы керек. Бір уақытта бірнеше файлдарды ашуға болады.

Ашық файлдардың арасында енгiзу мен шығаруы белгіленеді. Файлдарды ашу мен жабу деректердің ағындарын қайта тағайындауға қарағанда əлдеқайда көп уақытты алады.

Visual Prolog файл ашқан жатқан кезде, ол операциялық жүйенің файлдың бейнелі түрде атын нақты атымен байланыстырады жəне осы бейнелі түрде аты енгiзу мен шығаруға бағыттылынады.

Файлдардың бейнелі түрде аттары кішкентай əріптен басталуға тиісті жəне file доменды сипатталғанда хабарландыруға тиісті. Мысалы: file = file1; source; auxiliary; somethingElse Кез келген программада тек қана бір file домен рұқсат берілген. 1 кестеде қөрсетілген бес кірістірілген file альтернативтерді Visual Prolog таниды.

1кесте. File доменның кірістірілген альтернативтер

Альтернатива   Сипаттама
keyboard Пернетақтада оқу (Үндемеу бойынша)
Screen Мониторға жазу
Stdin Стандарттық енгізуден оқу
Stdout Стандарттық шығуын жазу
Stderr Қателерді шығару үшін стандарттық құрылымға жазу

Файлдарды ашу жəне жабу

Файлдарды ашу мен жабу үшін стандарттық предикаттар туралы келесі бөлімдер сипаталады.

Ескерту. Файлды ашқанда кері слэш (\), дискінің подкаталогың белгілеу үшін қолданылады. DOS бағдарланған болжамдарда Visual Prolog ESC символ (бағдарлаушысы-мен) келеді. Сондықтан программада файлға белгіленген жолды екі (\\) кері слэш әрдайым көрсету маңызды. Мысалы, «с:\\prolog\\include\\iodec1.con».

Файлға рұқсаттың жолынн ұсынады: с:\prolog\include\iodec1.con

Предикат openread/2

 Предикат openread оқу үшін OSFileName файл ашады, келесі формат қолданылады:

openread (SymbolicFileName) % (i, i)

                Visual Prolog file домен жарияланған, SymbolicFileName бейнелі түрде аты бойынша ашық файлға айналады. Егер файл ашылмаса, Visual Prolog қателік туралы хабарлайды.

                Предикат openwrite/2

Предикат openwrite жазу үшін OSFileName файл ашады, келесі формат қолданады:

openwrite (SymbolFileName, OSFileName) % (i, i)

                Егер файл болса, онда оны жояды. Басқа жағдайда Visual Prolog жаңа файлды құрады жəне оның тиiстi тiзбесiнде сыйғызып салады. Егер файл жасалмаса, Visual Prolog қателiк туралы хабар бередi.

Предикат openappend/2

Предикат openappend файлдың соңына жазылса OSFileName файлды ашады. Сонымен бiрге келесі формат қолданылады: openappend(SymbolicFileName, OSFileName) % (i, i)

Егер файл жазуға ашыла алмаса, Visual Prolog қателiк туралы хабарлайды.

                Предикат openmodify/2

Предикат openmodify жазу мен оқу үшін OSFileName ашады, Егер файл болса, ол қайта жазылмайды, openmodify келесі формат:

openmodify (SymbolicFileName, OSFileName)   % (i, i)

Егер жүйе OSFileName аша алмаса, Visual Prolog қателiк туралы хабарландырады. Оpenmodify предикаты кез келген рұқсаты бар файлының толтырулары үшін стандарттық filepos предикатпен бiрге қолданыла алады.

                Предикат filemode/2

Предикат filemode мәтіндік режимде файлды ашқан кезде және мәтіндік немесе екілік режимде көрсетілген файлды орнатады, келесі форматта: 

filemode (SymbolicFileName, FileMode) % (i, i)

                Егер FileMode =0, SymbolicFileName файл екілік режимге келеді. FileMode=1, онда ол мәтіндік режимге келеді.

                Мәтіндік режимде жазғанда жаңа жолдарға «Келесі жолға өту» / «Енгізу пернесі» символдар қосылады, ал оқығанда бұл екі символ жаңа жол сияқты түсіндіріледі.

Carriage return (возврат каретки) = ASCII 13

Line feed (перевод строки) = ASCII 10

                Екілік режимде ешқандай өзгерістер болмайды. Екілік файлды оқу үшін тек қана readchar немесе екілік файлдарға рұқсат предикаттар қолданады.

                Предикат closefile/1

Closefile предикаты белгіленген файлды жабады, ол келесі форматты қолданады:

closefile (SymbolicFileName) % (i)

                Предикат readdevice/1

readdevice предикаты readdevice current_read_device (оқудың ағымды құрылымы) қайта анықтайды немесе оған атын қайтарады. Предикаттың форматы readdevice (SymbolicFileName)

Предикат writedevice/1

 Егер SymbolicFileName айнымалысы анықталса жəне файл оқуға ашық болса, readdevice предикат оқудың ағымды құрылымын қайта анықтайды. Егер SymbolicFileName айнымалы-сы бос болса, онда readdevice оқудың белсенді ағымды құрылымының атын береді. Егер көрсетілген файл жазғанға немесе қосқанға ашылса, writedevice предикат жазу құрылымын қайта анықтайды. Егер SymbolicFileName айнымалысы бос болса, онда writedevice жазудың белсенді ағымды құрылымның атын береді.

Файлды жабу, файлға жазу жəне файлды ашу үлгілері

  1. Келесi тiзбекті жазу үшiн MYDATA.FILнiң файлды ашады, writedeviceнiң екi предикатта-рының арасындағы операторлармен, содан соң барлық шығарудың MYDATA.FIL-нiң файлға бұл destinationнiң file доменiнiң сипаттама пайда болатын бейнелi түрде атына сəйкес келетіне бағыттайды, мысалы:

domains

file = destination

goal

openwrite(destination,  «MYDATA.FIL»),

writedevice(OldOut), % Шығарудың ағымды құрылымын аламыз

writedevice(destination), % Файлға шығаруды қайта жібереміз writedevice(OldOut), % Шығарудың ағымды құрылымын қалпына келтiремiз.

2.программа ch2e09.pro (листинг 1) символдарды тіркелген пернетақтада TRYFILE.ONE файлға дисктегіні салады, read және write стандарттық предикаттарды қолданады.

                Тіркелген символдар дисплейдің экранына шығарылмайды. Сіздерге жақсы жаттығу болады, егер осы символдарды экранға шығару программаны жазғанда. Клавишаны басқанда файл жабылады.

Программа ch12e09.pro

domains

file = myfile

predicates

readloop — procedure () run — procedure ()

clauses readloop:-

readchar(X),

X<>‘#’,!,

write(X),

readloop

readloop.

run:-

write(«This program reads your input and writes it to»),nl, write(«tryfile.one\n»),

write(«For stop press #»),nl, openwrite(myfile,»tryfile.one»), writedevice(myfile),

readloop,

closefile(myfile),

writedevice(screen),

write(«Your input has been transferred to the file tryfile.one»),nl.

goal run.

Стандарттық енгізу/шығаруды қайта анықтау

file доменда stdin, stdout, stderr үш қосымша опциялар бар. Бұл файлдық ағындарының артықшылығы келесіде: сiз командалық жолында стандарттык енгізу / шығаруды қайта тағайындауға болады (кесте2)

2-кесте Файлдық ағындар мен сипаттамалар

.stdin Стандартты енгiзу файлы болып табылады. Ол тек оқуға арналған. Оны (stdin) readdevice пернетақтада stdin енгiзеді.

.Stdout – жазуға арналған Стандартты шығару файлы. Оны (stdout) writedevice терминалының пернесі бойынша stdout енгiзу құрылымымен тағайындайд            ы.           

.stderr бұл жазудағы қателерді шығаруға арналған стандартты файл. Бұл терминалдың экраны Writedevice (stderr) қателердi шығару үшiн stderr. құрылымын тағайындайды.

Файлдармен жұмыс істеу

Бұл бөлiмде файлдармен жұмыс істеу үшiн басқа бiрнеше предикаттарды сипаттаймыз Олар: filepos, eof, flush, existfile, deletefile, renamefile, disk жəне copyfile.

Бірнеше мысал келтірейік:

  1. Келесі тізбектне somefile.pro файлға Text мəні жазып алынады(myfile сияқты айналып жатыр), 100 позициядан бастап файлдын бастауы бойынша. Text = «A text to be written in the file», openmodifу(myfile, «somefile.pro»), writedevice(myfile), filepos(myfile, 100, 0), write(Text), closeflie(myfile).

Листинг программасында бұл жасалғандарды, байттың артында байт файлдың ішіндегісін қолданып filepos тексеруге болады. Бұл программа файлдың атын сұрайды, файлдың позициялардың ішіндегісін содан кейінгісін көрсетіп, позициялардың нөмерлері пернетақтамен енгізіліп отырады.

2 листинг. ch12e09.pro программасы

domains file = input

predicates

inspect_positions(file) — determ (i)

clauses inspect_positions(UserInput):-

readdevice(UserInput), nl,write(«Position No? «), readln(X), term_str(ulong,Posn,X),

readdevice(input), filepos(input,Posn,0), readchar(Y),nl, write(«Char is: «,Y),

inspect_positions(UserInput).

goal

write(«Which file do you want to work with ?»),nl, readln(FileName),

openread(input, FileName), readdevice(UserInput), inspect_positions(UserInput).

Предикат Eof/1

Eof перидикатын тексеруі, процесте алған оқуларға файлдың соңымен позиция келеді. Eof перидикатының түрлері:.

eof(SymbolicFileName) % (i)

Егер файл құқықтармен орындаулар уақыты тек қана жазуға ашық болса қатені eof бреді. Предикат ( + комбинациялы пернелер) DOS файлдың аяқталуы ерекше мəн туғызбайды.

Предикат пайдалы файлдармен жұмыс істеуінде предикатты анықтау үшін қолдануға пайдалы, мысалы, файлдың аяғына жете болмайтын кезде Вile нүктені сол мезгілдерге дейін қайтарады.

Предикат repfile predicates файлдармен жұмыста repfile(FILE)

clauses repfile(_).

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

Келесі программада біреу файлды өзгертеді, барлық əріптер бастапқы болып келеді. Листинг 3. Программа ch12e11.pro

domains

file = input; output predicates

convert_file — procedure () repfile(FILE) — nondeterm (i) run — determ ()

clauses convert_file :-

repfile(input),

readln(Ln),

upper_lower(LnInUpper,Ln), /* converts the string to uppercase */ write(LnInUpper),nl,

fail. convert_file. repfile(_). repfile(F):-

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

run:-

write(«Which file do you want convert ?»), readln(InputFileName),nl,

write(«What is the name of the output file ?»), readln(OutputFileName),nl,

openread(input, InputFileName), readdevice(input), openwrite(output, OutputFileName), writedevice(output),

convert_file, closefile(input), closefile(output).

goal run.

Предикат flush/1

Передикат  аталған файлға ішкі буферлер flush  ішіндегісін жазып отырады.

flush(SymbolicFileName) %  (i)

Ол буфер «барлық құлату жүйесін» сұрап жатыр.

Предикат existtile/1

Егер передикат existfile программасын сəтті орындаса, онда OSFileName файлы табылады. Предикат OSFileName тізбесі бола алады, ал сияқты, \psys\ *.cfg аты алмастырулар таңбалары бола алады: Егер файлдың аты тізбекте белгі қойылған жолда емес предикат жетіспеушілігінің existfile де болады. Бірақ, «system» (Жүйелік) қойылған атрибуттармен барлық файлдарды, файлдарды қоса existfile де табады, жəне «hidden» де (Бүркеме), ол тізбелерді таба алмақ. Суреттеп айтылған төмендегі тізбелерді іздестірулер предикаттардың қолдануымен істелінген болу мүмкін.

Тексеру үшін файл дискіде болған жағдайда ғана (оны ашпастан алдын) пайдалана алуға болады open(File, Name) :-

existfile(Name), openread(File, Name). open(_, Name) :-

write(«Error: the file «, Name,» is not found»).

Предикат searchfile/3

Предикат тізім жолдарында файлды табу үшін searchfile қолданылады. searchfile(PathList, Name, FoundName) % (i, i, o)Егер дискке түбірде autoexec.bat орналасқан:, C тең FoundName орнайды : \AUTOEXEC.BAT.

Файлдың аты алмастырулар бола алады. Бұл жағдайда алмастырулар болатын файлдан толық атымен сабақтас FoundName болады, жəне төменде суреттеп айтылған тізбелер іздестіру предикаттар үшін дəлелді сапада қолданылуы мүмкін болуы керек. Егер алдыңғы мысалдың файлдың атының атап қалған *.bat орнына мысалы autoexec.bat, сабақтас FoundName көрстсе болады: \ *.ВАТ.

Предикат deletefile /1

Предикат deletefile оның берілген аргументтері мен формалары мен берілген файлдарфн өшіріп тастайды. deletefile(OSFileName) % (1)

Егер файл алып тастай алмаса предикат қатені көрсетеді. OSFileName біржолдық нышандар бола алмайды.

Предикат renamefile/1

Предикат renamefile NewOSFileName атынан OldOSFileName атын өзгертіп жатыр. Ол өз формасын алады.

renamefile(OldOSFileName,  NewOSFileName) %  (i,  i)

Егер NewOSFileName атымен файл болмаса предикат табысты renamefile болып қалады, жəне екеуі де файлдық өзгерген аттармен сақталып қалады.

Предикат disk/1

Предикат ағымдағы диск өзгеруі үшін disk қолданады немесе каталогта/подкаталота өз қалыпын алады : isk(Path) %  (i),  (о)

Шақыруда параметрге, ағымдағы тізбеге disk қайтарылады. Бұл дискте қазіргі ағымдағы тізбесіз өзгеріссіз басқа дискке ауыстырып қосу үшін DOS-Бағдарлаған болжамдарда D қолданылады:. Бұл жерде D – құрылым таңбалаушы əріп.

Предикат copyfile/2

Предикатта файлдың көшірмесін алу үшін copyfile қолданылады. Ол екі параметрді қабылдайды:.copyfile(SourceName, DestinationName) % (i, i)

Бұл файлдарға жолдар дисктер жəне тізбелерді қоса алғанда файлдардың аттары толық немесе ішінара беріле алады. Қайта құрылмалы нышандарға тыйым салынған. Көшіріп алған атрибуттарын жəне құқықтарын бастапқы файл алады.