Тэкставыя стандартныя файлы

Знаёмства з файлавай сістэмай

У алгарытмічных мовах выкарыстоўваецца тэрмін «файл» для выз­на­чэн­ня спецыяльна арганізаванай паслядоўнасці кампанентаў аднаго і та­го ж ты­пу, парадак чаргавання якіх вызначаецца самой паслядоўнасцю.

У любы момант даступны толькі адзін кампанент файла. Іншыя да­ступ­ны шляхам прагляду файла. Колькасць кампанентаў, якую называем даў­жы­нёй файла, пры апісанні файла ў праграме не фіксуецца. Файл, які не ўтрым­лі­вае ніводнага кампанента, называецца пустым.

Над файлам можна выконваць два яўныя дзеянні:

· прагляд файла (з пачатку ў канец); пры гэтым у любы момант да­ступ­ны толькі адзін кампанент файла. У час прагляду файла забараняец­ца змя­няць значэнні кампанентаў;

· стварэнне файла, якое атрымліваецца ў выніку дабаўлення новых кам­па­нен­таў у канец першапачатковага пустога файла.

Усе астатнія дзеянні над файламі ёсць кампазіцыя яго прагляду і ства­рэн­ня.

Для паслядоўных файлаў працэсы стварэння і прагляду файлаў не мо­гуць адвольна чаргавацца. Гэта чаргаванне стала магчымым для файлаў з пра­мым доступам.

Паслядоўны доступ – асноўная ўласцівасць усіх прылад з механічным пе­ра­мяш­чэн­нем. Многае, што тычыцца файла, звязана са складанасцю рэ­а­лі­за­цыі яго на вылічальнай машыне. Для захавання файла прыцягва­юць за­па­мі­нальныя прылады (ЗП). Некаторыя ЗП на самай справе дапус­каюць то­ль­кі паслядоўны доступ да інфармацыі, якая знаходзіцца на іх. Гэта ты­чыц­ца прынтэра, дысплея. Але ж і на дысках кожная асобная да­рожка – пры­ла­да з паслядоўным доступам.

Прамы доступ – паслядоўны доступ, але ў двухмернай прасторы.

Файлавы тып

Файлавы тып – гэта «акно ў свет» для праграмы на мове Pascal. Пры да­па­мо­зе файлавай сістэмы праграмай здзяйсняецца ўвесь увод і вывад ін­фар­ма­цыі.

Файл – гэта спецыяльна арганізаваная паслядоўнасць даных, раз­мер­ка­ва­ных па-за рабочай памяццю праграмы (на ЗП).

Некаторыя файлы могуць толькі прымаць інфармацыю (напрыклад, пры­ла­ды друку), некаторыя – толькі выдаваць інфармацыю (напрыклад, кла­ві­я­ту­ра), многія і прымаць, і выдаваць. Гэтая ўласцівасць дыктуецца кан­с­т­рук­цы­яй знешніх прылад.

Вызначаючы файлы ў праграме, мы можам пры іх дапамозе зносіцца з перыферыяй ПК і ў тым ліку накопліваць даныя, каб пазней звяртацца да іх. Файлавыя тыпы мовы Pascal адрозніваюцца толькі тыпамі даных, якія змяшчаюцца ў іх.

Тэкставыя файлы – гэта файлы, якія будуюцца з ASCII кодаў сім­ва­лаў (разам з кіруючымі кодамі). Яны арганізуюцца па радках, утрым­лі­ваюць ко­ды #13=^М і #10=^J і абавязкова спецыяльны код, які назы­ва­ец­ца канцом фай­ла (код #26=^Z). Асноўная ўласцівасць такіх файлаў у тым, што яны мо­гуць быць створаны і праграмным шляхам, і ў нейкім тэкставым рэ­дак­та­ры.

Файлы з тыпам – кампанентныя файлы. У адрозненне ад тэкставых фай­лаў, файлы з тыпам будуюцца з машынных уяўленняў даных наперад аб’яўленага тыпу. Яны захоўваюць даныя ў тым жа выглядзе, што і ў аператыўнай па­мя­ці ПК. Значыць, асноўная ўласцівасць такіх файлаў у тым, што яны не мо­гуць быць створаны непраграмным шляхам. Такія файлы маюць справу з данымі наперад аб’яўленага тыпу.

Нетыпізаваныя файлы маюць справу з адвольнымі наборамі байтаў не­за­леж­на ад іх структуры і прыроды.

Пры дапамозе файлавых тыпаў вызначаюць файлавыя пераменныя, якія маюць адну ўласцівасць: яны не могуць удзельнічаць у аператарах на­дан­ня значэння.

Тэкставыя стандартныя файлы

У мове Pascal прадугледжаны стандартны від сувязі. Для гэтага апі­са­ны два тэкставыя файлы: Input і Output.

Існуюць чатыры працэдуры, пры дапамозе якіх здзяйсняюцца апе­ра­цыі ўводу-вываду даных, звязаныя з файламі тыпу Text:

Інфармацыя ідзе з клавіятуры ў стандартны файл Input, стандартны файл Output звязаны з дысплеем. Працэдуры ўводу-вываду могуць быць як з параметрамі, так і без іх. Калі ўводзім (ці выводзім) некалькі даных, яны аддзяляюцца ў спісе ўводу (вываду) коскай.

Апісанне тэкставага файла:

Var Ft : text;

Фарматы працэдур для чытання (уводу) інфармацыі з тэкставага фай­ла:

Read(Ft, x);

Read(Ft, x1, …, xn);

дзе першы параметр Ft – імя файлавай пераменнай, а другі – пераменная даз­во­ле­на­га тыпу, у якую ўводзіцца нейкае значэнне. Калі Ft = Input, та­ды ў аператарах уводу імя файла можа быць апушчана.

Read і Readln – працэдуры без параметраў. Чакаецца любы ўвод з кла­ві­я­ту­ры (паўза).

Аператар Read(Input, x) эквівалентны аператару Read(x); апе­ра­тар Read(Input, x1, …, xn) – аператару Read(x1, …, xn). Апе­ра­тар Read(Ft,x1, …, xn) эквівалентны раду аператараў: Read(Ft,x1); Read(Ft,x2); …; Read(Ft,xn); аператар Readln(Ft,x1, …, xn) – нас­туп­на­му раду аператараў: Read(Ft,x1); Read(Ft,x2); …; Readln(Ft,xn), дзе x1, …, xn – пераменныя да­пуш­ча­ль­ных тыпаў.

Фарматы працэдур для вываду інфармацыі ў тэкставы файл:

Write(Ft, x); Writeln(Ft, x);

Write(x); Writeln(x);

Працэдура Write(Ft, x1, …, xn) эквівалентная Write(Ft, y1); …; Write(Ft, yn).

Працэдура Writeln(Ft, x1, …, xn) эквівалентная Write(Ft, y1); …; Writeln(Ft, yn), дзе першы параметр Ft – імя файлавай пе­ра­мен­най тыпу text.

Калі Ft º Output, тады яго можна апусціць.

Writeln(Ft) {выводзіць пусты радок у файл Ft}

Writeln {выводзіць пусты радок у файл Output}

Заўвага. Значэнні, якія выводзяцца, аўтаматычна пераўтворацца з унут­ра­на­га ўяўлення ў сімвальнае; значэнні, якія ўводзяцца, – з сім­ва­ль­на­га ўяўлення ва ўнутранае.

Увод даных розных тыпаў

Тып пераменных пры ўводзе з клавіятуры можа быць толькі прос­тым, не ўнутраным (г. зн. цэлым, сапраўдным, сімвальным) ці радковым або сумяшчальным з імі (дыяпазоны).

· Пры ўводзе лікавыя значэнні павінны набірацца па пра­ві­лах сін­так­сі­су. Два лікі лічацца раздзеленымі, калі паміж імі ёсць хоць адзін пра­бел, ці сімвал(ы) табуляцыі (#9), ці канец радка (#13#10).

· Калі ўводзіцца сімвальнае значэнне, тады ў адпаведную пераменную за­пі­шац­ца чарговы сімвал за апошнім, уведзеным да гэтага.

Напрыклад, няхай апісаны дзве сімвальныя пераменныя c1, c2:
VAR c1, c2 : Char. Вынік выканання аператара Read(c1, c2) прад­стаў­ле­ны ў наступнай табліцы.

 

Уведзена з клавіятуры c1 c2
аб¿ 'а' 'б'
а¿б¿ 'а' #13
¿ #13 #10

 

Сімвал ¿ азначае націсканне клавішы ўводу <Enter>.

· Увод радкоў. Пачатак радка ідзе адразу за апошнім уведзеным да гэ­та­га сімвалам (з першай пазіцыі, калі радковая пераменная стаіць пер­шай у спісе ўводу). Чытаецца колькасць сімвалаў, роўная аб­’­яў­ле­най даўжыні радка. Але калі ў час чытання пападаецца сімвал #13, та­ды чытанне радка спыняецца, але сам сімвал #13 у радковую пе­ра­мен­ную не за­піс­ва­ец­ца, бо ён служыць раздзяляльнікам радкоў.

· Як увесці булеўскае значэнне? Паколькі гэта ўнутраны тып і ён не пры­ста­са­ва­ны да ўводу, то можна прымяніць наступную хітрасць:

VAR by : Byte;

boo : Boolean ABSOLUTE by;

{дазваляе пераменную boo размясціць на месцы

пераменнай by і ўвесці значэнне ў by}

. . .

Read(by);

{закадзіруйце 0 = False, 1 = True і ўвядзіце
з клавіятуры 0 ці 1 – гэта і будзе лічыцца
булеўскім значэннем}

Пасля набору даных для адной працэдуры Read націскаецца клавіша ўво­ду <Enter>. Значэнні пераменных павінны ўводзіцца ў строгай ад­па­вед­нас­ці з парадкам пералічэння іх у спісе ўводу і з сінтаксісам мовы. Калі ж, напрыклад, x1 мае тып Integer, а пры ўводзе набіраецца зна­чэнне ты­пу Char (значыць, нейкі сімвал), то ўзнікне памылка ўводу-вы­ва­ду. Па­ве­дам­лен­не аб памылцы мае наступны выгляд: I/O error XX, дзе XX – код па­мыл­кі. Тлумачальны тэкст у даведніках дапаможа вызна­чыць прычыну праг­рам­на­га перарывання.

Прыклад.

VAR I : Real;

J : Integer:

K : Char;

BEGIN

Read(I, J, K);

Набяром першы варыянт уводу: 235.98 100 G

Гэта добры ўвод, і адбудзецца наданне значэнняў, але пераменная К ат­ры­мае не значэнне 'G', а прабел:

I := 235.98; J := 100; K := ' ';

Набяром другі варыянт уводу: G 235.98 100

Другі варыянт выкліча памылку ўводу, бо для пераменнай I тыпу Real уводзіцца значэнне тыпу Char.

Паколькі інфармацыя пападае ў буфер уводу, то калі ў праграме ёсць не­ка­ль­кі Read, даныя для кожнага ўводзяцца патокам, і іх можна набі­раць у ад­ным радку да яго заканчэння.

Напрыклад, няхай A, B – Integer, C, D – Real. Разгледзім фраг­мент уводу:

Read(A, B); Read(C, D);

Набіраем значэнні для ўводу адзін за другім без пераходу на новы ра­док: 1875 34 2.62 1.54E+01 <Enter>. Аднак пасля кожнага ліку мож­на націскаць <Enter>.

Працэдура ўводу Readln аналагічна Read, за выключэннем таго, што пас­ля счытвання апошняга ў спісе значэння для апошняй пераменнай ад­бы­ва­ец­ца пераход курсора на наступны радок. Аператар Readln(fv, x1, …, xn) эквівалентны аператарам Read(fv, x1); Read(fv, x2); …; Readln(fv, xn).

Фактычна інфармацыя ідзе ў буфер уводу, а затым адлюстроўваецца на экране.

Калі ідзе чытанне з Input ці з тэкставага файла, які назначаецца на эк­ран, уводзіцца адзін радок уваходнага тэксту за адну аперацыю. Радок за­па­мі­на­ец­ца ва ўнутраным буферы тэкставага файла, і калі радок чыта­ецца, гэ­ты буфер выкарыстоўваецца як уваходная крыніца. Масівы ўводзяцца паэлементна, запісы – па палях. Увод мностваў не прадугледжаны.

Вывад даных розных тыпаў

Працэдура запісу Write выконвае вывад даных у радок і не закрывае яго, але на дысплеі, калі дайшлі да мяжы, радок разрываецца і ёсць пераход на наступны радок. Калі гэта быў апошні радок экрана, то адбываецца зрух (прагортка) экрана. Вывад можа ісці ў бесфарматным варыянце ці ў фар­мат­ным. У аператарах вываду

Write(y1, …, yn); Writeln(y1, …, yn);

параметры y1, …, yn могуць мець тры варыянты запісу:

Е (бесфарматны вывад)

Е:F (фарматны вывад)

Е:F:d (фарматны вывад толькі для сапраўдных даных!).

Тут Е, F, d – выразы. Е – той выраз, што выводзім (просты вы­па­дак – імя пераменнай дазволенага тыпу). Цэлалікавы выраз F паказвае, ко­ль­кі пазіцый можа заняць Е (значыць, агульная шырыня поля). Цэлалікавы вы­раз d паказвае, колькі пазіцый у полі F стаіць пасля кропкі. Для ад­люс­т­ра­ван­ня чарговага значэння Е пры бесфарматным вывадзе на экране ці прын­тэ­ры бярэцца некаторы памер экрана па змаўчанні ў залежнасці ад ты­пу выразу Е. Выраз Е належыць да наступнага тыпу: цэлалікавы, сап­раў­д­ны, Char, String, Boolean. Для масіваў неабходна арганізаваць іх па­э­ле­мен­т­ны вывад, запісы выводзяцца па палях. Вывад мностваў не пра­дуг­лед­жа­ны.

Вывад сімвалаў

Сімвал займае адну чарговую пазіцыю ў бесфарматным варыянце.

VAR c : Char;

c:='a';

Write(c);Writeln; {вынік Þ a}

Write(c, c, c); {вынік Þ aaa}

У бесфарматным варыянце фармат задаецца канструкцыяй Е: F, дзе Е – той выраз, што выводзім (просты выпадак – імя пераменнай даз­во­ле­на­га тыпу), F – цэлалікавы выраз. Калі F – цэлае дадатнае значэнне, тады інфар­ма­цыя прыціскаецца да правага краю поля даўжыні F.

Write(c:3);

Writeln(c:3, c:4, c:5);

{вынік: ||a||a

A