Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль - лекциии.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1 Mб
Скачать

Операції введення-виведення текстових файлів.

Введення і виведення числової і текстової інформації в ТР здійснюється операторами

- введення read (f, x) або readln (f, х);

- виведення write (f, х) або writeln (f, x).

Якщо в операціях введення - виведення першим параметром стоїть логічне ім'я файлу, то це означає, що потік даних буде прийматися read на конкретний фізичний пристрій, з яким зв'язане в даний момент часу логічне ім'я цього файлу.

що по суті відкриває канали введення-виведення. В ТР можна, не вагаючись, опустити program. Oпеpaтоp read та readln - це оператори введення інформації. Їх аргументами повинні-бути списки змінних, значення яких будуть зчитані. Тип змінних при введенні із текстового файлу може бути тільки цілим, дійсним, символьним, рядковим або сумісним з ними.

Складні, структуровані типи можуть бути введені тільки по-елементно, або по полям для запису.

При введенні числових значень два числа вважаються розділеними, якщо між ними є хоча б один проміжок. При введенні з клавіатури завжди останньою повинна натискатися клавіша введення, так як саме вона змушує програму приймати введені перед цим букви або цифри. Введення рядку здійснюється таким чином:

-Початок рядка йде відразу за останнім введеним до цього символом;

-Зчитується кількість символів, рівне об'явленій довжині рядка;

Але якщо під час зчитування зустрівся символ з кодом #13, то читання рядку припиняється. Сам символ #13 вважається розділювачем рядків і в змінну ніколи не зчитується. При введенні з клавіатури особливої різниці між read та readln немає. Процедура readln зчитує значення поточного рядка і переводить позицію на початок наступного рядка, навіть якщо в поточному рядку залишилися не прочитані дані. Виклик readln (f) зовсім пропустить рядок в файлі, a readln без вказівника в файлі зробить паузу до натискання клавіші введення. Символ #26 також являється розділювачем і обмежує рядок, але за ним зчитування вже неможливе, файл на цьому закінчується.

Оператори write і writeln виводять значення х, або список значень XI,Х2 ,...Хn в текстовий файл f. (Якщо файл не вказаний, то вважається, що виведення направлене в файл OUTPUT).

Значення, при виведенні, можуть мати лише цілі, дійсні, символьні, рядкові типи, а також похідні від них. Всі можливі структури (записи, масиви) повинні виводитись по їх полям або по елементам. Множини, вказівники., або файли змінних також не можуть бути виведені без попереднього їх перетворення в складові, що виводяться. Виключення -тільки тип Boolean.

Приклад:

Const x: boolean =tme;

у: boolean =false;

........................

write (x, '... ',y);

Оператор write виводить на екран true...false. Ці значення прочитати із файлу в такому вигляді не можна. Щоб одержати із файла логічне значення, необхідно закодувати його: 0-false, і-true, зчитати в байтову змінну, а потім перетворити в логічне значення.

Var by:Byte;

boo: Boolean absolute by;

……………………………..

Read(by);

Процедура write виводить дані в поточний рядок і не зачиняє його, тобто

наступні дані запишуться в той же рядок.

Формально в зовнішньому файлі розмір рядка не обмежений. Виключення - виведення на дисплей.

Процедура writeln виводить рядок даних і закриває його, переписує

символ #13 в його кінець. Це автоматично відкриває наступний рядок, а на екрані повертає курсор в крайню ліву позицію і опускає його на рядок вниз.

Оператори write(f) або writeln(f), де f - ім'я логічного файлу, даний без списку виведення, створює пустий рядок, що має один тільки признак кінця рядка.

Існує можливість керування форматом виведення даних. Можна вказати формат, а саме створити поле для розміщення цих значень. Формати мають зміст тільки при роботі з текстовими файлами. У всіх інших випадках вони не застосовуються.

Задача: Написати програму, яка дописує літеру с в кінець тексту t.

uses crt;

type tekst=file of char;

var t:tekst;

sv:char;

begin

assign(t,’a.dat’);

append(t);

write(t,’c’);

close(t);

reset(t);

while not EOF (t) do

begin

read(t,sv);

write(sv);

end;

close(t);

end.

Задача: Type Текст = file of char

Описати процедуру, яка записує в тексті t тільки перше входження кожної літери.

Uses crt;

Type

Text=file of char; m=array [-1..50] of char;

var

f :text;

s:set of char;

mas:m;

sim:char;

i:integer;

procedure x(var m1:m);

begin

clrscr;

reset(f);

while not (eof(f)) do

begin read(sim);

if sim in s then writeln(‘ ’)

else begin

write(sim);

s:=s+[sim];

end; end; end;

begin

assign(f,’sss.dat’);

rewrite(f);

writeln(‘enter the text’);

for i:=1 to 10 do

begin

read(mas[i]);

write(f,mas[i]);

end;

close(f);

s:=[];

x(mas);

readln;

end.

ТИПІЗОВАНІ (КОМПОНЕНТНІ) ФАЙЛИ.

Це файли з об'явленим типом його компонентів, тобто файл з набором даних однієї і тієї ж структури. Об'ява такого типу файлу має наступний вигляд:

File оf<тип_компонентів>;

де компонентою може бути довільний стандартний або структурований тип. зарані визначений або побудований програмістом. Все дозволено, заборонено лише об'являти файли файлів, файли об'єктів, а також файли структурованих компонентів, які також мають файли або компоненти. При написанні програми не обов'язково об'являти спеціальні файлові типи. Це можна зробити при описі змінних. Для роботи з об'явленим файлом необхідні звичайні попередні дії: зв'язування файлів змінних з фізичним файлом, відкриття файлу для читання і для запису.

Assign(FP, 'P.DAT');

Reset(FP);

.................................

Rewrite(FP);

Для типізованих файлів обидві процедури Reset та Rewrite встановлюють режим зчитування-запису у відповідності із значенням попередньо визначеної системної змінної FileMode. Вона по замовчанню рівна двом, тобто незалежно від вибору процедури відкриття, файл відкривається і для читання, і для запису. Це вірно лише для типізованих і безтипових файлів. Цей порядок порушується, якщо значення FileMode відповідає режиму тільки запису (1), або тільки читання (0). Змінити режим можна простим присвоюванням потрібного значення змінній FileMode перед відкриттям файлу. Після цього виклик Reset буде відкривати файл у заданому режимі, навіть якщо він буде тільки режиму запису.

Після відкриття файлу введення-виведення даних здійснюється

стандартними операторами:

Read(f,x); Write(f,x);

Першим аргументом повинне бути ім'я логічного файлу з яким зв'язаний "конкретний фізичний файл. Далі повинна стояти змінна або їх список того ж типу, що і об'явлений тип компонентів файлу, в яку записується чергове значення із файлу при читанні, чи навпаки - яка записується в файл. На відміну від файлів типу text, типізовані файли мають більш строгу внутрішню структуру. При запису в них записується машинне представлення чергового компоненту будь-то число, масив або запис. В середині файлу компоненти не відділяються нічим один від одного (але всеодно знайти компонент нескладно : кожен з них займає в файлі однаковий об'єм, що дорівнює його розміру). Тому не має сенсу застосовувати до типізованих файлів оператори readln та writeln. В них просто не існує такого поняття як рядок і його кінець, і не має признаку кінця файлу (кінець визначається довжиною файлу). Навіть, якщо об'явити файл як:

Var f:file of string[80];

він не буде схожий на файл текстів та рядків. В ньому як і раніше не буде символів кінця рядка, а буде (після запису) суцільна послідовність символів, кратна 81. Гірше того, якщо реальне значення рядка менше 80 символів, то всеодно в файлі виявиться по 81 символу на рядок, а надлишок буде забитий сміттям. Тому, любі спроби трактувати типізований файл, як текстовий, особливо спроби вивести його на екран, викличуть помилку.

Для спеціальних цілей (написання програм перекодування тексту) можна представляти текстові файли як file of char. Це не оживить процедур readln та writeln, а також функції EOLN, що працюють з текстами, але при додержуванні недоторканості і не змінності кодів кінця рядка і кінця файлу дасть можливість побуквенного читання, зміни і послідуючого

запису в інший file of char вихідного тексту (щоб не закладати імена текстових файлів в текст самої програми, слідувало б використовувати функцію ParamStr).