Бақылау сұрақтары
Қатар ұзындығы қалай анықталады?
Қатар ұзындығының стандарт предикаты бар ма?
Конкатенация амалы қандай мақсатта қолданылады?
Қатарды бөлшектеу үшін қандай предикат пайдаланылады?
Frontstr предикаты мен frontchar предикатынан айырмашылығы қандай ?
Тақырып №14: Файлдар. Файлдық домен. Файлдармен жұмысқа арналған стандарт предикаттар.
Жалпы файл деген дискіге жазылған атау берілген мәліметтер жиынтығы. Оқу не жүктелу барысында файлдық айнымалы кезектегі компонентке ауысады және оны қолдану, өңдеу мүмкіндігі беріледі. Пролог жүйесінің файлдармен жұмыс ұйымдастыру принципімен танысайық.
Пайдаланушы файлдары домендерді сипаттау бөлімінде келесі түрде сипатталады:
File = < 1 файлдың символдық атауы >; … ;
<файлдың символдық атауы>
Файлдық домендерді сипаттау кезінде file доменінің типі теңдіктің сол жағында орналасады, ал символдық атаулары теңдіктің оң жағында орналасады. Оларды файлдың сыртқы және физикалық атауларынан ажырату үшін ішкі немесе логикалық файл атаулары деп те атайды. Файлдың символдық атауы кіші әріптерден басталуы қажет.
Пайдаланушы файлдарынан басқа домендерді сипаттау бөлімінде сипаттамаса да болатын стандартты файлдар да болады. Бұл:
Stdin (енгізудің стандартты құрылғысы);
Stdout (шығарудың стандартты құрылғысы);
Stderror (қателер жөнінде хабарлама шығарудың стандартты құрылғылары);
Keyboard (пернетақта);
Screen (монитор);
Printer (принтердің параллелді порты);
Coml (кезектілік порты);
Қалыпты жағдайда енгізудің стандартты құрылғысы болып пернетақта саналады, ал стандартты шығару құрылғысы – монитор. Пайдаланушы файлымен жұмысты бастау үшін оны ашу қажет, ал соңынан оны жабу қажет. Бұл жағдайда енгізу/шығарудың стандартты құрылғыларын, сонымен қатар параллельді порттарды ашу және жабудың қажеті жоқ.
Турбо Пролог жүйесінде файлдарды ашу/жабуға және басқа да операцияларды орындауға арналған кірістірілген предикаттарды қарастыралық.
Файлды ашуға арналған стандарт предикат жұмысын қарастырамыз. Келесі төрт предикаттардың әр қайсысы екі енуші параметрлерден тұрады. Бірінші параметр – бұл ішкі символдық атау, ол домендерді сипаттау бөлімінде көрсетіледі; екінші параметр – бұл қатар, ол файлдың сыртқы атауын бейнелейді.
Openread предикаты файлды тек оқу үшін ғана ашады. Егер көрсетілген сыртқы атауымен файл табылмаса, предикат орындалмайды, сәйкесті түрде қателік туралы ақпарат шығарады.
Openwrite предикаты файлды жазу үшін ғана ашады. Бұл предикат дискіде жаңа файл құрады. Егер көрсетілген файл атымен аттас тағы бір файл табылса, ол өшіріледі. Егер қандай да бір жағдайларға байланысты файл құрыла алмаса, предикат орындалмай, сәйкесті қателік хабарламасы шығады.
Openappend предикаты файлды файл соңына жазба кірістіру үшін ғана ашады. Егер мұндай файл табылмаса, предикат сәйкесті қателік туралы хабарламаны шығарады.
Openmodify предикаты файлды бір мезгілде жазу үшін де, оқу үшін де ашады. Егер мұндай файл табылмаса, сәйкесті қателік туралы хабарлама шығарылады.
Көрсетілген атаумен файлдың бар немесе жоқ болуын тексеру үшін exisfile предикаты қолданылады. Бұл предикатта бір аргумент болады. Егер параметр ретінде көрсетілген файл атауы бар болса, предикат ақиқат болады, кері жағдайда–жалған болады.
Пролог жүйесінде басқа программалау тілдерімен салыстырғанда (мысалы, Паскаль тілі) файлдың символикалық атауы оның физикалық атымен байланыстырылады, сондықтан файлды ашу үшін оның ішкі атауын сыртқы атымен байланыстыру қажет емес. Әдетте «\» символы каталогтар атын бөлу үшін қолданылады, ал Турбо Прологта символ кодтарын жазу үшін екі сызықша (« \\ ») қолданылады. Мысалы, «C:\ prolog\ BIN», жолын көрсету үшін « C:\\ prolog \\ BIN» деп жазу қажет.
Мысал. Стандартты openread предикаты үшін алмастыру жазайық. Файл бар болған жағдайда предикат оны оқу үшін ашады, кері жағдайда–мұндай атаумен файл табылмағаны туралы хабарлама шығарады. Бұл предикаттың openread предикаты секілді екі аргументі бар. Бірінші аргументі файлдың символикалық аты болып табылады, екіншісі - файлдың сыртқы атауын көрсететін қатар. Предикатты түрлендіру нәтижесі нақты, дұрыс, ықшам болуы тиіс, және ашылуы қажет файлдың бар немесе жоқ болуына қарамастан сәтті (нәтижелі) аяқталуы тиіс.
Бұл предикатты дайындау барысында файлдың бар болуын тексеру мақсатында кірістірілген exisfile предикаты қолданылады; openread предикатымен бұрын құрылған файлды ашуға болады; write предикатымен хабарлама шығаруға болады:
OpenFile (F,N): -
exisFile(N) , ! , / * N атаулы файлдардың бар немесе жоқтығын тексеру */
openread(F,N) . /**/
OpenFile (_ , N): -
Write(”N атаулы файлдар табылған жоқ”)
Осыған ұқсас openappend және openmodify предикаттарын да түрлендіруге болады. Openwrite предикатын файлды жазу үшін ашу кезінде предикат бұл файлдың мазмұнын жойылып кететіні туралы хабарлама, ескертулер шығаратындай етіп түрлендіруге болады.
Ашық тұрған файлды жабу үшін ClouseFile предикаты қолданылады. Предикат кез келген жағдайда оң аяқталады, егер көрсетілген файл жоқ болса да, әрекет орындалған болып саналады.
Жабық файлмен толық жұмыс жасауға болады, renamefile және deletefile предикаттары көмегімен оның атын өзгертуге немесе өшіруге болады.
Deletefile предикаты көрсетілген файлды өшіреді. Егер белгілі бір жағдайда байланысты файл өшірілмесе, бұл предикат қателік туралы хабарлама шығарады.
Renamefile предикаты файлдың бұрынғы атын жаңа атау беру арқылы өзгертеді.
Disk предикаты ағымдағы дискі немесе каталогты білуге мүмкіндік береді.
Сонымен қатар dir предикаты да бар. Ол файлдар тізімінен шаблонға сәйкес, каталогта орналасқан, бірінші параметрді көрсеткен файлды таңдауға мүмкіндік береді. Enter пернесін басқанда таңдалған атау айнымалыға барып түседі.
Бұл предикаттың үш қосымша енуші параметрімен берілген үш нұсқасы бар: төртіншісі – ішкі каталогтардың көрінуін қосады / жабады; бесіншісі – F4 пернесін басу арқылы шаблондардың өзгеруін іске қосады / алып тастайды; алтыншысы – тақырыптар терезесінде файлдың көріну жолының бейнеленуіне рұқсат береді / рұқсат бермейді. Төртінші, бесінші және алтыншы параметрлердегі нөл сәйкесті опцияға тиым салады, нөлдік емес мәні – рұқсат беру.
Eof предикаты ( end of file қысқартылған сөзі - «файл соңы») файл соңы көрсетілген жағдайда орындалады, кері жағдайда – ол орындалмайды. Ол көбінесе файлдың барлық компоненттерін рекурсивті есептеуді ұйымдастыру кезінде қолданылады. Егер оны ашық тұрған файлға жазба ендіру үшін қолдансақ, сәйкесті қателік туралы хабарлама шығарады.
Файл мазмұнын компоненттер ағымы ретінде қарастыруға болады. Файлдағы оқу мен жазудың ағымдағы позициясын білу үшін, не болмаса бұл позицияны өзгерту үшін Filepos предикаты қолданылады.
Оның үш аргументі бар: бірінші аргумент – файлдың символдық атауы, екіншісі – бірінші аргумент ішіндегі позиция, үшіншісі – позициясы қайдан басталатынын көрсететін режим нөмері. Режим нөмері үш мәннің біреуін қабылдай алады: нөл, бір немесе екі.
Егер ол нөлге тең болса, онда позиция файл басынан басталады. Егер ол бірге тең болса, онда позиция ағымдағы позициядан басталып саналады. Ал екіге тең болғанда, предикат ағымдағы позицияны өзгертеді. Сондықтан егер екінші аргумент белгіленбесе, ал үшінші аргумент бірге тең болса, онда екінші аргументке нөл беріледі. Ағымдағы позицияның орнын ауыстыру әрине нөлге тең болады. Егер үшінші аргумент екіге тең болса, онда позиция файл соңынан бастап саналады.
Предикат екі түрлі жағдайда қолданыла алады. Егер оның барлық аргументтері байланысқан болса, онда оқу немесе жазу орнындалып жатқан позиция, екінші аргумент белгіленген санға сәйкес өзгертіледі. Егер оның екінші аргументі бос болса, ал бірінші және үшіншісі байланысқан болса, онда үшінші аргумент оқу мен жазудың ағымдағы позициясымен белгіленеді.
Енгізу / шығару ағымдарын қайта бағыттауға арналған екі предикатқа тоқтала кетейік. Енгізудің ағымдағы құрылғысын қайта анықтау үшін немесе енгізудің қай құрылғысы ағымдық екендігін білу үшін readdevice предикаты байланыспаған параметрмен қолданылса, онда ол оған ағымдағы мезетте белсенді болып тұрған ақпарат оқу құрылғысы атауын қайтарады. Егер оның параметрі оқу үшін ашық тұрған құрылғы атауымен белгіленіп тұрса, онда бұл предикат ақпараттты енгізудің белсенді құрылғысын қайта анықтайды.
Writedevice предикаты readdevice предикатына ұқсас, алайда ол ағымдағы шығару құрылғысын пайдаланады. Ағымдағы жазба құрылғысына мәлімет жазу үшін Write предикаты қолданылады. Белсенді құрылғыдан ақпаратты оқу үшін readln(қатарды оқиды), readint(бүтін санды оқиды), readreal(нақты санды оқиды), readchar(символды оқиды), readerm(термді оқиды) предикаттары пайдаланылады.
File_str предикаты файлдағы символдық қатарларды түгелімен оқиды немесе керісінше, қатар мазмұнын файлға жазып алады, бұл процесс предикаттың екінші аргументінің бос болуына байланысты. Бұл предикаттың бірінші параметрі болып файлдың символдық атауы табылады, ал екіншісі – файл мазмұны саналатын қатар табылады.
Flush предикаты файлға арналған ішкі буфер мазмұнын файлға мәжбүрлеп жазу үшін қолданылады. Негізінде ол принтермен жұмыс жасағанда пайдаланылады.
Және ең соңғы предикат, бұл – Filemode предикаты. Ол файлға ену режимін білуге немесе файлды қолдану режимін орнатуға мүмкіндік береді. Бұл предикаттың екі параметрі бар. Бірінші параметрі - файлдың символдық атауы, екінші параметрі бірінші параметрде атап көрсетілген файлмен жұмыс жасау режимін береді немесе қабылдайды. Егер екінші параметрі бос болса, онда ол файлдың ағымдағы жұмысымен белгіленеді, ал егер екеуі байланысқан болса, көрсетілген режим орнатылады. Екінші параметр екі түрлі мәннің біреуін қабылдауы мүмкін. Нөл мәні файлмен жұмыстың екілік (бинарлық) режиміне сәйкес келеді. Ал бір мәні - мәтіндік режимге сәкес келеді. Мәтіндік режимде қатарларға каретканы қайтару символдары және қатардың орнын ауыстыру қарастырылады. Көбіне мәтіндік режим қолданылады, себебі, екілік режимде деректерді символдық етіп қана жазуға болады.
Достарыңызбен бөлісу: |