Знаёмства з файлавай сістэмай
У алгарытмічных мовах выкарыстоўваецца тэрмін «файл» для вызначэння спецыяльна арганізаванай паслядоўнасці кампанентаў аднаго і таго ж тыпу, парадак чаргавання якіх вызначаецца самой паслядоўнасцю.
У любы момант даступны толькі адзін кампанент файла. Іншыя даступны шляхам прагляду файла. Колькасць кампанентаў, якую называем даўжынёй файла, пры апісанні файла ў праграме не фіксуецца. Файл, які не ўтрымлівае ніводнага кампанента, называецца пустым.
Над файлам можна выконваць два яўныя дзеянні:
· прагляд файла (з пачатку ў канец); пры гэтым у любы момант даступны толькі адзін кампанент файла. У час прагляду файла забараняецца змяняць значэнні кампанентаў;
· стварэнне файла, якое атрымліваецца ў выніку дабаўлення новых кампанентаў у канец першапачатковага пустога файла.
Усе астатнія дзеянні над файламі ёсць кампазіцыя яго прагляду і стварэння.
Для паслядоўных файлаў працэсы стварэння і прагляду файлаў не могуць адвольна чаргавацца. Гэта чаргаванне стала магчымым для файлаў з прамым доступам.
Паслядоўны доступ – асноўная ўласцівасць усіх прылад з механічным перамяшчэннем. Многае, што тычыцца файла, звязана са складанасцю рэалізацыі яго на вылічальнай машыне. Для захавання файла прыцягваюць запамінальныя прылады (ЗП). Некаторыя ЗП на самай справе дапускаюць толькі паслядоўны доступ да інфармацыі, якая знаходзіцца на іх. Гэта тычыцца прынтэра, дысплея. Але ж і на дысках кожная асобная дарожка – прылада з паслядоўным доступам.
Прамы доступ – паслядоўны доступ, але ў двухмернай прасторы.
Файлавы тып
Файлавы тып – гэта «акно ў свет» для праграмы на мове 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