Тэкставыя стандартныя файлы
У мове 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 ці з тэкставага файла, які назначаецца на экран, уводзіцца адзін радок уваходнага тэксту за адну аперацыю. Радок запамінаецца ва ўнутраным буферы тэкставага файла, і калі радок чытаецца, гэты буфер выкарыстоўваецца як уваходная крыніца. Масівы ўводзяцца паэлементна, запісы – па палях. Увод мностваў не прадугледжаны.