русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Створення текстових файлів.


Дата додавання: 2013-12-23; переглядів: 2396.


Текстові файли можна створити декількома способами.

Перший – текстовий файл створюється посимвольно.

Задача: написати програму по символьного формування рядків файлу.

Program p1;

Const n=5;

Var f: text;

i:integer;

sim: char;

Begin

Assign (f, ‘tek1’);

Rewrite (f);

For i:=1 to n do

Begin

Repeat

Read (sim); {вводимо симв. з клавіатури}

Write (f, sim) {запис в файл}

Until (sim = #13);

end;

close (f);

Reset (f);

While not eof(f) do

Begin

While not eoln(f) do

Begin

Read (f, sim);

Write (sim);

End;

Readln (f);

Writeln (f);

End;

End.

Формування файлу здійснюється за допомогою вкладених циклів. Зовнішній цикл забезпечує формування n рядків. У внутрішньому циклі організовано введення та запис в файл символа за символом до тих пір, поки не буде натиснута клавіша Enter. Саме її код (#13) входить до умови виконання циклу Repeat. Читання створеного файлу також виконується в двох циклах. Внутрішній цикл організує посимвольне читання рядку, доки не зустрінеться ознака кінця рядку. Оператор Readln (f) спрацьовує тільки після закінчення внутрішнього циклу, що забезпечує перехід на новий рядок.

Посимвольне читання файлу використовують в різних випадках, наприклад, для перекодування текстового файлу.

Другий – текстовий файл можна сформувати, використовуючи готові рядки (дані String).

Задача: написати програму створення та читання текстового файлу.

Uses CRT;

Const ob =’Grupa’;

Var fam: string[25];

spisok: text;

simv: char;

Begin

Assign (spisok, ob);

Rewrite (spisok);

Repeat

Writeln (‘Вв. наступне прізвище’);

Readln (fam);

Writeln (spisok, fam);

Writeln (‘для продовження роботи введіть будь-який символ’);

Writeln (‘для закінчення – необхідно ввести символ N (прописний)’);

Readln (simv)

Until simv = ‘N’;

Close (spisok);

Reset (spisok);

Writeln;

Writeln (‘зміст файлу’);

While not eof(spisok) do begin

Readln (spisok, fam);

Writeln (fam);

end;

End.

В циклі вводиться рядок, натискується Enter та будь-яка клавіша, як ознака припинення формування файлу. Цикл завершиться після введення символу N. Зверніть увагу на те, що рядок записується у файл за одне виконання оператора Writeln, а при читанні такого файлу вживають оператор Readln. Такий спосіб обробки файлу використовується в тих випадках, коли рядок якимсь чином створюється в оперативній пам’яті, а потім записується на диск, або прочитаний з файлу рядок аналізується в пам’яті як звичайний рядок String.

Третій – текстові файли можна створити у будь-якому текстовому редактору, тобто не програмним шляхом, а обробляти в самій програмі.

Задача: в файлі test2 записані цілі додатні та від’ємні числа. Кількість рядків та кількість чисел в кожному рядку невідома. Треба обчислити суму та кількість від’ємних чисел в кожному рядку, загальну кількість чисел у рядку та загальну кількість рядків.

Program pf3;

Var f: text;

i, j, x, s, kol: integer;

Begin

Clrscr;

Assign (Var f, ‘test2’); {файл створено в текстовому редактору}

Reset (Var f);

i:=0; {загальна кількість рядків}

while not eof(f) do

begin

j:=0; { загальна кількість чисел у рядку }

s:=0; {сума від’ємних чисел}

kol:=0; {кількість від’ємних чисел }

inc(i);

while not eoln(f) do

begin

read (f, x);

write (lst, x:5); {підключення модуля, який підтримує файл lst – якщо потрібно вивести результат на принтер}

ins (j);

if x<0 then begin

s:=s+x;

kol:=kol+1;

end;

end;

writeln (lst);

writeln (lst, ‘s=’, s:5; ‘kol=’, kol:5, ‘j=’, j:5);

Readln (f);

End;

Writeln (lst, ‘загальна кількість рядків=’, i:5);

Close (f);

End.

Зовнішній цикл забезпечує перехід від одного рядка до іншого. У внутрішньому циклі читається та аналізується число за числом.

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

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

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

- введення 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).

Переваги типізованих файлів :

- Вони максимально ефективним способом характеризують числову інформацію;

- Дозволяють зчитувати і записувати складні і громіздкі структури буквально однією командою.

Наприклад:

Туре

Dim_20*1OO=array[1..20,1..100]of real;

Var xx, yy: dim_20* 100;

F:file of dim_20xlOO;

Begin

Reset(f);

read(f,xx); {відкриває файл і зчитує відразу весь масив}

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

write (f,yy); {записує відразу весь масив}

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

end.

Масив чисел yy буде записаний в файлі як один елемент. Якщо записано файл масивів, то в нього не можна записати окреме число (як і не можна прочитати одне число).

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


<== попередня лекція | наступна лекція ==>
ЧИТАННЯ ТА ЗАПИС ФАЙЛІВ. | БЕЗТИПОВІ ФАЙЛИ.


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн