69117

Фізичний і логічний файли. Технологія роботи з файлами. Тинпи файлів і оголошення файлових змінних. Установка відповідності між фізичним і логічним файлами. Системні операції з файлами

Лекция

Информатика, кибернетика и программирование

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

Украинкский

2014-09-30

141 KB

1 чел.

Лекція 26. Тема: Фізичний і логічний файли.

                             Технологія роботи з файлами. Тинпи файлів і оголошення файлових змінних.

                             Установка відповідності між фізичним і логічним файлами.

                             Системні операції з файлами.

План:

1. Фізичний і логічний файли

2. Технологія роботи з файлами

3. Типи файлів і оголошення файлових змінних

4. Установка відповідності між фізичним і логічним файлами

5. Відкриття та закриття файлів

6. Зчитування і запис текстових файлів

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

1. Фізичний і логічний файли

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

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

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

Файл як логічний об'єкт є послідовністю значень певного типу, тобто він складається з однотипних компонентів. Отже, файл — це структурований елемент даних. I тому цілком природним є те, що в мові Раsсаl для зображення файлів визначені стандартні структуровані типи даних і можуть бути оголошені змінні цих типів. Оскільки компоненти файла належать до одного типу, то структура логичного файла нагадує структуру масиву. Але можна назвати и суттеві розбіжності між цими структурами даних. А саме:

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

розмір масиву, на відміну від розміру файла, не може змінюватися під час роботи з ним;

для доступу до елементів масиву застосовують індексацію, а для доступу до компонентів файла - покажчики на поточний компонент;

нумерація елементів масиву виконується від певної нижньої до певної верхньої межі індексу. Компоненти файла нумеруються починаючи з нуля. Наприкінці фізичного файла записується керуючий символ #26 (Ctrl+Z), що використовується як ознака завершення відповідного логічного файл;

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

2. Технологія роботи з файлами

Робота з файлом у мовi Раsсаl складається з таких етапів: оголошення файлової змінної; зв'язування файлової змінної з іменем наявного файла або файла, що створюється; відкриття файла; обробка файла; закриття файла. Ці етапи розглядатимутъся в розділах 9.2.1-9.2.5.

3. Типи файлів і оголошення файлових змінних

Файли класифікують за типом компонентів і за методом доступу до них. За типом компонентів розрізняють текстові та 6інарні (двійкові) файли, а за методом доступу — файли послідовного і прямого доступу. Текстові файли призначені для збереження текстів (наприклад, текстів Раsса1-програм), а бінарні файли використовуються для збереження даних різних типів. Відмінності між послідовким і прямим доступом до компонента файлів буде роз'яснено у розділах 9.2.4 і 9.2.5.

Текстовий файл є сукупністю символьних рядів змшної довжини. Кожен рядок завершується маркером кінця рядка — спеціальною парою керуючих символів: #13 (повернення каретки) та #10 (переведення рядка). Наприкінці файла записується маркер кінця файла — керуючий символ #26. Приклад текстового файла, що складаєтъся з двох рядків, наведено на рис. 9

1-й рядок файла       

Т

Е

К

С

 Т

 О

 В

И

Й

#13

#10

Ф

А

Й

Л

#13

#10

#26

            2-й рядок файла                                                                                                                                           

                               Рис.9.1. Текстовий файл, що є сукупністю рядків

Бінарні файли в мові Раsсаl поділяютъся на типізовані та нетипізовні. Типізований файл складається з компонентів одного типу. Кожний компонент має порядковий номер, номер першого компонента дорівшює нулю. Інформація в типізованих файлах зображується в тому самому вигляді, що і в пам'яті комп'ютера, і тому відпадає потреба у використанні керуючих символів типу кінця рядка або повернення каретки. Приклад зображення даних у файлі, що містить компоненти рядкового типу, наведено на рис. 9.2.

Нетипізований файл у мові Раsсаl розглядається як сукупність байта. Компонентом нетипізованого файла вважається запис, довжина якого за замовчуванням становить 128 байт.

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

Синтаксис оголошення файлової змінної залежить від типу файла. Далі наведена синтаксис оголошення змінної текстового, типізованого та нетипізованого файла.

var <ім’я файлової змінної>: text;

var <ім’я файлової змінної>: file of <тип компонентів>;

var <ім’я файлової змінної>: file;

Приклади оголошення файлових змінних наведено нижче.

Приклад 9.1

program ex9_1;

type

  Data=record

     name:string;

     address:string;

     birthday:integer;

   end;

var t1:text;                   {текстовий файл}

     bin1:file of data;    {файл записів}

     bin2:file of integer; {файл цілих чисел}

     nt:file;                     {нетипізований файл}

begin

end.

4. Установка відповідності між фізичним і логічним файлами

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

Assign(<файлова змінна>;<рядковий вираз>);

Значенням рядкового виразу має бути ім'я фізичного файла. Формат цього імені визначається операційною системою. Нагадаємо, що повне ім’я файла в операційних системах  МS-DОS та Windows має такий вид:

<ім’я логічного диска>:\<ім’я каталогу 1>\<ім’я каталогу 2>\…\ <ім’я файла>.<розширення>

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

Виклик процедури Assign має передувати викликам усіх інших процедур обробки файлів. У прикладі 9.2 виконано зв'язування файлових змінних із фізичними файлами.

Приклад 9.2

program ex9_2;

type

     data=record

         name:string;

         address:string;

         birthday:integer;

       end;

var t1:text;

     bin1: file of data;

     bin2:file of integer;

     nt:file;

begin

   Assign(t1, ‘document.txt’);

   Assign(bin1, ‘anketa.doc’);

   Assign(bin2, ‘d:\bp\numbers.dat’);

   Assign(nt, ’bytechain.bit’);

end.

5. Відкриття та закриття файлів

Фізичний файл, із яким була зв'язана файлова змінна, може перебувати в одному з таких станів.

Файл  відкритий для читання: читання даних із файла дозволено, а запнс до файла - заборонено.

Файл відкритий для запису: дозволений лише запис даних до файла.

Файл відкритий для читання і запису: дозволено як читання, так і запнс до файла. У цьому стані не можуть перебувати текстові файли.

Файл закритий: із файлом не можна виконувати жодних дій.

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

Відкриття файла для читання або для читання і запису виконуєтъся процедурою Reset, для якої є два варіанти синтаксису.

Reset (<файлова змінна>);

Reset (var <файлова змінна>: File; <розмір запису>: Word);

Перший варіант процедури використовується для текстових і типізованих файлів, другий –для  нетипізованих. Текстові файли процедура Reset відкриває лише для читання, а бінарна файли для читання і писання.

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

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

В результаті спроби відкрити файл, якого немає на диску, виникне помилка Еггог #2: File not found (Файл не знайдено). Щоб запобігти перериванню програми внаслідок спроби відкрити неіснуючий файл, використовують директиву компілятора ($I-). Вона вимикає автоматичний контроль помилок введення та виведення. Директиву ($I+) використовують для вввмкнення такого контролю. Якщо контроль помилок введення-виведення вимкнено, то для перевірки наявності файла на диску можна використовувати функцію IOResult. Коли файл існує на диску, функція IOResult повертає значення 0. Приклад 9.3 показує, як використовуються директиви компилятора {$І-), ($I+) і функція IOResult під час відкриття файла.

Приклад 9.3

program ex9_3;

var F: file of Byte;

begin

   Assign(F, ‘file. dat’);

   {$I-}              {відключення контролю введення-виведення}

    Reset(F);

   {$I+}             {включення контролю введення-виведення}

    if  IOResult = 0 then

       writeln(‘File is open’)

    else

      writeln(‘File not found’);

end.

Відкриття файла для запису або читання і запису здійснюється процедурою Rewrite, для якої існує два варіанти синтаксису:

Rewrite(<файлова змінна>);

Rewrite(var <файлова змінна>: file; <розмір запису>: Word);

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

Якщо аргумент процедури Rewrite зв’язаний з іменем неіснуючого файла , то файл з таким іменем буде створений. Якщо цю процедуру використати для відкриття вже наявното файла, то вміст файла буде видалено та створено новий порожній файл. Процедура Rewrite встановлює файловий покажчик на початок файла.

  Для дописування рядків до вже наявного текстового  файла його потрібно відкрити за допомогою процедури Append:

Append (<файлова змінна>);

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

Файли закриваються процедурою Close:

Close(<файлова змінна>);

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

6. Зчитування і запис текстових файлів

Нагадаємо, що текстовий файл є сукупністю рядів змінної довжини, до яких можливий лише послідовний доступ. Як було зазначено више, кожен рядок текстового файла завершується маркером кінця рядка, що складається із двох символів: #13 та #10. Кінець файла позначається символом #26. Ідентифікатором типу текстового файла є слово text.

Зчитування даних із текстового файла здійснюється процедурами Read та Readln за таким синтаксисом:

Read(<файлова змінна>;<список введення>);

Readln(<файлова змінна>;<список введення>);

Тут <список введення> є переліком змінних символьного, рядкового, цілочислового або дійсного типу.

Після зчитування певного компонента файловий покажчик зсувається до наступного компонента. Якщо виконується зчитування з файла до змінної типу char, то процедура Read зчитує один символ. Коли досягнуто кінця рядка, результатом зчитування є символ кінця рядка, #13, а коли досягнуто кінця файла, зчитується символ кінця файла, #26.

Під час зчитування значення до змінної цілочислового або дійсного типу спочатку виділяється підрядок, в якому видалені всі ведучі пробіли, символи табуляції (#9) і маркери кінця рядка. Далі зчитуються всі символи, що утворюють число зі знаком. Зчитування припиняється при виявленні першого пробілу, маркера кінця рядка або символу табуляції. Зчитаний рядок цифрових символів перетворюється на число, що присвоюється відповідній змінній. Наступна операція зчитування починається з пробілу (маркера кінця рядка, символу табуляції тощо).

Якщо виділений підрядок містить нецифрові символи, то виникає помилка введення-виведення Еггог 106: Invalid numeric format (Некоректний числовий формат).

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

Приклад 9.4

Розглянемо приклад зчитування даних із текстового файла у змінні різних типів. Результат роботи програми зображено на рис. 9.3. Програма опрацьовувала файл, який містив такі дані: 5 -20 1 2 3 4 5 string.

program ex9_4;

var f:text;

     a,i:integer;

     b:real;

     s:string;

     mas:array[1..5] of integer;

begin

     writeln(‘reading from the text file’);

     Assign (f, ‘f.txt’);

     Reset(f);

     read(f,a,b);

     for i:=1 to 5 do

        read(f,mas[i]);

     readln(f,s);

     writeln(‘a=’,a,’b=’,b,’s=’,s);

     writeln(‘array of integers:’);

     for i:=1 to 5 do

       write(mas[i], ‘ ‘);

    writeln;

    Close(f);

    readln;

end.

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

Приклад 9.5

Наведемо програму, що виводить на екран перші п’ять рядків текстового файла.

program ex9_5;

var f:text;

     s:string;

     i:integer;

begin

   writeln(‘reading rows from the text file’);

   Assign (f,’t.txt’);

   Reset(f);

   for i:=1 to 5 do

   begin

     readln(f,s);

     writeln(s);

  end;

  Close(f);

  readln;

end.

Запис до текстового файла здійснюєтъся за допомогою процедур Write та Writeln, що мають такий синтаксис:

Write(<файлова змінна>;<список введення>);

Writeln(<файлова змінна>;<список введення>);

Тут <файлова змінна> - змінна типу text; <список виведення> - перелік змінних або виразів символьного, рядкового, цілочислового, дійсного чи логічного типу.

Зауважимо, що процедура запису до текстового файла відрізняється від процедури виведення на екран лише тим, що першим її параметром є файлова змінна. Тому всі особливості застосування процедур Write i Writeln, що були розглянуті в розділі 2.5.3, зберігаються і в разі виведення даннх до текстового файла.

Різниця між процедурами Write та Writeln полягає в тому, що рядок, який записується до файла за допомогою процедури Writeln, завершується символом кінця рядка. Якщо процедура Writeln використовується без списку виведення, то до файла записується порожній рядок.

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

Приклад 9.6

program ex9_6;

var f:text;

     s:string;

     a,i:integer;

     b:real;

begin

  writeln(‘Usage of the procedure writeln of file’);

  Assign(f,’example.txt’);

  Rewrite(f);

  for i:=1 to 5 do

  begin

     writeln(‘enter integer, real, string’);

     readln(a,b,s);

     writeln(f,’a=’,a,’b=’,b,’s=’,s);

   end;

   Close(f);

   readln;

end.

Вміст текстового файла example.txt може бути, зокрема, таким:

a=1 b=2.0000000000E+00 s=Pascal

a=2 b=3.0000000000E+00 s=C++

a=3 b=4.0000000000E+00 s=Java

a=-4 b=-3.4500000000E+00 s=PHP

a=5 b=6.7800000000E+00 s=html

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

Eof(<файлова змінна>):boolean;

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

While not eof(f) do

    Readln(f,s);

Функція Ео1п визначає, чи посилається файловий покажчик на маркер кінця рядка. Наведемо її синтаксис:

Eoln(<файлова змінна>):boolean;

Якщо поточним символом є маркер кінця рядка, функція Ео1п повертає значення true.

Приклад 9.7

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

Розробку програми почнемо із визначення глобальних змінних. Файлові змінні слід оголошувати як глобальні. Це забезпечить можливість їх використання у будь-яких підпрограмах. Отже, для файла, що створюється під час введення рядків із клавіатури, оголосимо зміну f1, для файла, що доповнюється найдовшими словами,-змінну f2. Оскільки за умовою розглядаються текстові файли, то файлові змінні належатимуть до типу text.

Алгоритм програми пошуку найдовших слів у рядках текстового файлу

Зв'язати файлові змінні з фізичними файлами.

Створити текстовий файл шляхом введення його рядків з клавіатури та вивести його для контролю.

3.    Обробити послідовно рядки файла.

3.1. Зчитати рядок із файла у рядкову змінну.

3.2. Визначити у рядку найдовше слово та дописати його в кінць рядка.

3.3. Отриманий рядок записати у новий файл.

4.    Вивести файл, який було створено в результаті виконання кроку 3.

Розробимо процедури, що виконуватимуть кроки 2-4 даного алгоритму. Процедура створення вхідного файла Create_f1 відкриватиме файл f1 для запису і дозволить користувачеві вводити рядки до нього доти, доки користувач не дасть негативної відповіді на запит continue? [у/п] (продовжувати? [так/ні]). Алгоритм процедури AddWord, що визначає найдовше слово у рядку

1. Зчитати рядок із файла у рядкову змінну.

2. Скопіювати зчитаний рядок для подальших перетворень.

3. Вважати перше слово найдовшим. Присвоїти його змінній word, а його довжину — змінній maxl.

4. Повторювати дії, зазначені у кроках 5-7, доти, доки рядок не стане порожнім.

5. Видалити з рядка перше слово.

6. Знайти перший пробіл у рядку, визначити кілъкістъ символів до нього та вважати це значення довжиною шуканого слова. Якщо першим символом рядка є пробіл, то шукане слово порожнє, а його довжина дорівнює нулю.

7. Порівняти обчислену на кроці 5 довжину слова із значенням змінної maxl. Якщо значення maxl виявилося меншим, присвоїти змінній maxl обчислену довжину слова, а саме слово присвоїти змінній word.

8. Дописати слово, що міститься у змінній word, наприкінці копії вхідного рядка, що її було створено під час виконання кроку 2.

Процедура Out виводить файл, зв'язаний з її параметром. Принцип роботи цієї процедури є очевидним.

program ex9_7;

uses crt;

var

  f1,f2:text;

{===========створення текстового файла===============}

procedure Create_f1;

var

  key:char;        {ознака завершення введення даних}

  s:string;          {рядок, у який вводять дані}

begin

  Rewrite(f1);   {відкрити файл для запису}

  repeat

     writeln(‘input string:’);

     readln(s);    {ввести з клавіатури рядок}

     writeln(f1,s);  {записати рядок у файл}

     writeln(‘continue? [y/n]’);

     key:=readkey;

   until upcase(key)=’N’;

   Close(f1);

end;

{===========додавання до рядка найдовшого слова===========}

procedure AddWord;

var

   max1:integer;     {довжини найдовшого слова}

   word;                 {найдовше слово у рядку}

   sa,sb:string;        {зчитаний і записаний рядок}

begin

   Reset(f1);            {відкрити файл для читання}

   Rewrite(f2);         {відкрити файл для запису}

   while not eof(f1) do {доки не кінець файла}

   begin

     readln(f1,sa);         {читати рядок із файла}

     sa:=sa+’ ‘;              {додати пробіл у кінець рядка}

     sb:=sa;                    {скопіювати рядок}

     maxl:=pos(‘ ‘,sa)-1; {перше слово}

     word:=copy(sa,1,maxl);{вважати найдовшим}

     while pos(‘ ’,sa)<>0 do {доки у рядку є пробіли}

     begin

       delete(sa,1,pos(‘ ‘,sa));   {видалити перше слово}

{якщо максимальна довжина менша довжини поточного слова}

       if maxl<pos(‘ ‘,sa)-1 then

       begin        {то запам’ятати нову довжину та слово}

           maxl:=pos(‘ ’,sa)-1;     {найбільша довжина слова}

           word:=copy(sa,1,maxl);  {найдовше слово}

        end;

      end;

      sa:=concat(sb,word);  {дописати слово у кінець рядка}

      writeln(f2,sa);    {записати рядок у новий файл}

    end;    {кінець циклу читання файла}

    Close(f1);

    Close(f2);

end;

{===========виведення файла на екран==================}

procedure Out(var textfile:text);

var s:string;      {рядок зчитаний із файла}

begin

    Reset(textfile);     {відкрити файл для читання}

    while not eof(textfile) do  {доки не кінець файла}

    begin

      readln(textfile,s);   {читати рядок файла}

      writeln(s);      {вивести рядок на екран}

    end;

    Close(textfile);   

end;

begin

   Assign(f1,’ex9_7.txt’);  {зв’язати логічні}

   Assign(f2,’ex9_7n.txt’);   {та фізичні файли}

   Create_f1;

   writeln(‘----source file ex9_7.txt-------‘);

   Out(f1);

   AddWord;

   writeln(‘------result file ex9_7n.txt------‘);

   Out(f2);

   readln;

end.

У мові Раsсаl означені стандартні текстові файли input та output. Вони вважаються відкритими під час виконання оцерацій введення з клавіатури та виведеання на екран, тому процедури write, writeln, read i readln за замовчуванням використовують файлові змінні iput та output. Наприклад, еквівалентними будуть такі оператори:

writeln(‘output to the screen’);

writeln(output, ‘output to the screen’);

readln(input, a,b);

readln(a,b);

Текст можна виводити не тільки на екран або диск, але і на інші стандартні ристрої виведення, такі як комунікаційні порти введення-виведення, принтер або порожній (NULL) пристрій. 3 метою моделювання процесу виведення на ці пристрої використовуються текстові файли з іменамн СОN, РRN, LPT1 тощо. Логічне ім’я CONвідповідає так званій консолі, введення даних через яку здійснюється з клавіатури, а виведення на екран. Логічні імена LPT1,LPT2,LPT3 зіставлені з паралельними портами, через які здійснюється виведення текстів на принтері. Якщо до комп’ютера підключено один принтер, то найчастіше використовують імена LPT1 або його стнонім PRN.   Для передачі даних із комп'ютера на комп'ютер та з метою керування мишею використовують послідовні порти з логічними именами COM1 та СОМ2. Синонімом імен СОМ1 є м'я АUX. Логічне ім'я NULL означає порожній пристрій, що інтерпретуєтъся як приймач інформації, що має необмежену ємність. Цей пристрій використовують під час налагодження програми.

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

Нагадаємо, що в мові Раsсаl визначено два різновиди бінарних файлів: типізовані і нетипізовані файли. Типізований файл є послідовністю однотипних компонентів. Нетипізований файл можна відкрити лише як файл компонентів однакового розміру, тобто як файл однотипних компонентів. Тому надалі, в роздшах 9.2.5  і 9.2.6, типізовані і нетипізовані бінарні файли не розрізнятимемо. Компоненти бінарного файла нумеруються, але їх кількість не є наперед відомою, як у масивах. Між компонентами не записуються жодні роздільники. Такого поняття, як рядок, а отже,і маркер кінця рядка, для бінарних файлів не означено.

Зчитування з бінарних файлів здійснюється лише процедурою Read, а запис -лише процедурою Write. Застосування до бінарних файлів процедур Readln або Writeln є неприпустимим, оскільки для таких файлів не означено поняття рядка. Синтаксис виклику процедур зчитування і запису у бінарні файли є таким:

Read(<файлова змінна>;<список введення>);

Write(<файлова змінна>;<список виведення>);

Тут <список введення> і <список виведення> - це перелік змінних того самого типу, що й тип компонентів файла.

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

Приклад 9.8

Створимо бінарний файл із компонентами типу byte і відобразимо його вміст двома способами: як послідовність символів і як послідовність чисел, які є АSСII-кодами відповідних символів.

Оголосимо дві файлові змнні: f - файл із компонентами типу byte і ff – файл із компонентами типу char. Процедурою Assign зв’яжемо ці файлові змінні з оним і тим самим фізичним файломFirst.dat. Спочатку дані у First.dat введемо через змінну f (процедура Create). Потім, використовуючи цю саму змінну f, відобразимо вміст файла як послідовність чисел і закриємо файл (ці дії виконує процедура ShowByte). Відкриємо фізичний файл First.dat повторно як логічний файл ff і відобразимо його вміст як послідовність символів (процедура ShowChar).

progrem ex9_8;

var

  f:file of byte;     {файл байтів}

  ff:file of char;  {файл символів}

  a:byte;    {змінна для читання чисел із файла}

  ch:char;   {змінна для читання символів із файла}

{=================створення файла===============}

procedure Create;

var i:integer;    {параметр циклу}

begin

   Rewrite(f);    {відкрити файл для запису}

   writeln(‘input 10 integers’);

   for i:=1 to 10 do

   begin

     read(a);     {ввести число з клавіатури}

     write(f,a);    {записати число у файл}

   end;

end;

{=========виведення файла як послідовності чисел=========}

procedure ShowByte;

bagin

  Reset(f);     {відкрити файл для читання}

  while not eof(f) do   {поки не досягнуто кінця файла}

  begin

    read(f,a);     {зчитати кампонент у змінну типу byte}

    write(a, ‘ ‘);   {вивести значення змінної}

  end;

  Close(f);   {закрити файл}

  writeln;

end;

{=======виведення файла як послідовності символів==========}

procedure ShowChar;

begin

   Reset(ff);

   while not eof(ff) do   {доки не досягнуто кінця файла}

   begin

      read(ff,ch);      {зчитати компонент у змінну типу char}

      write(ch, ‘ ‘);   {вивести значення змінної}

    end;

    Close(ff)

    writeln;

end;

begin

  Assign(f, ‘First.dat’);

  Assign(ff,’First.dat’);

  Create;

  writeln(‘entered numbers from First.dat’);

  ShowByte;

  ShowChar;

  readln;

end.

9.2.6. Прямий доступ до компонентів бінарних файлів

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

Прямий доступ до компонентів бінарного файла в мові Раsсаl здійснюється за допомогою процедур та функцій, наведених у табл. 9.1.

Таблиця 9.1. Процедури та фцнкції прямого доступу до компонентів бінарних файлів

Ім’я функції або процедури

Призначення

Seek(var f; n:Lngint);,процедура

Truncate(var f);,процедура

FilePos(var f):Longint;,функція

FileSize(var f):Longint;,функція

Переміщує файловий покажчик на компонент з номером n. Файл f має бути відкритий

Видаляє всі компоненти файла f від поточного компонента до кінця файла

Повертає номер запису, на який посилається файловий покажчик

Повертає кількість компонентів файла f

Механізм використання наведених у табл. 9.1 процедур і функцій проілюстровано у прикладі 9.9.

Приклад 9.9

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

type person=record

          name:string;  {імя працівника}

          salary:real;   {оклад}

       end;

Відсортуємо файл бульбашковим методом за зростанням окладів працівників. Під час сортування компоненти файла потрібно буде переставляти. Для дзбереження у памті значень компонентів, що переставдаються, оголосимо глобальні зміни comp1 i comp2 типу person. Ці ж самі змінні можна використовувати і під час введення або виведення вмісту файла. Сам фізичний файл f.dat зв'яжемо в файловою змінною f.

Зчитування даних з клавіатури та їх запис у файл здійснюватимуться у процедурі Create. Значення полів запису реrson слід вводити окремими операторами readln, але записувати дані про працівника у файл треба одним оператором write:

Rewrite(f);    {відкрити файл для запису}

for i:=1 to n do  {цикл введення значень 10 компонентів}

begin

    readln(comp1.name);   {ввести дані з клавіатури}

    readln(comp1.salary);

    write(f, comp1);         {записати дані у файл}

end;

Вміст файла виводитимемо процедурою Out, що викликатиметъся після створення файла та його сортування. Принцип дії цієї процедури є очевидним.

Під час сортування файла використаємо засоби прямого доступу до його компонентів. Спочатку встановимо файловий покажчик на початок файла: seek(f,0). Після цього зчитуватимемо з файла сусідні компоненти та порівнюватимемо значення їх полів sа1агу. Якщо компоненти не впорядковані, їх слід переставити:

seek(f,j);       {встановити файловий покажчик на кампонент з номером j}

read(f, comp1,comp2);       {читати два сусідніх компоненти}

if comp1.salary>comp2.salary then

begin            {якщо компоненти не впорядковані}

  seek(f,j);    {встановити файловий покажчик на компонент з номером j та записи компоненти в файл}

  write(f,comp2,comp1);     {у зворотному порядку}

end;

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

program ex9_9;       {сортування бінарного файла}

type person=record    {тип запису працівника}

         name:string;    {імя працівника}

         salary:real;     {заробітна плата}

     end;

var f:file of  person;    {файл записів}

     comp1,comp2:person;      {компоненти файла}

     n:integer;         {кількість працівників}

{================створення файла================}

procedure Create;

var i:integer;     {параметр циклу}

begin

   Rewrite(f);     {відкрити файл для запису даних}

   writeln(‘ennter number of persons’);

   readln(n);

   for i:=1 to n do      {цикл введення даних у файл}

   begin

        write(‘enter name:’);

        readln(comp1.name);

        write(‘enter salary: ’);

        readln(comp1.salary);

        write(f,comp1);    {записати дані у файл}

     end;

end;

{===============сортування файла===============}

procedure Sort;

var i,j:integer;

begin

   seek(f,0);    {вставити файловий покажчик на початок файла перебирати компоненти з кінця файла до                                                                               

                        початку}

   for i:=filesize(f)-1 downto 1 do

                      {перебирити компоненти від нульового до поточного}

      for j:=0 to i-1 do

      begin         {впорядкувати сусідні компоненти}

         seek(f,j);

         read(f,comp1,comp2);

         if comp1.salary>comp2.salary then

         begin

             seek(f,j);

             write(f,comp2,comp1);

           end;

        end;

end;

{==============виведення вмісту файла================}

procedure Out;

begin

   seek(f,0);      {встановити файловий покажчик на початок файла}

   while not eof(f) do   {доки не досягнуто кінця файла}

  begin

     read(f,comp1);     {зчитувати компоненти}

     writeln(comp1.name:8,comp1.salary:10:2);   {і виводити їх}

  end;

end;

{===============основна програма===================}

begin

   writeln(‘sorting of the binary file’);

   Assign(f,’f.dat’);

   Create;                 {створити файл}

   writeln(‘created file’);

   writeln(‘===name===salary====’);

   Out;            {вивести зміст файла}

   Sort;           {відсортувати вміст файла}

   writeln(‘sorted file’);

   writeln(‘===name===salary====’);

   Out;      {вивести вміст файла}

   Close(f);

   readln;

end.

Системні операції з файла

Крім процедур і фунцій, розглянутих раніше, у мові Pascal визначено процедури, за допомогою яких можна видалити файл або перейменувати його, тобто виконати операції, властиві операційній системі. Для видалення файла використовують процедуру Erase, а для перейменнування – процедуру Rename. Синтаксис зазначених процедур є таким:

Erase(<файлова змінна>);

Rename(<файлова змінна>,<наве ім’я>);

Тут <нове ім’я> - рядок, який має задовольняти вимоги операційної системи щодо специфікації імен файлів. Підприємств час виклику процедур Erase та Rename файл має бути закритим. Як приклад використання цих процедур наведемо код програми, що перейменовує файл.

var f:text;

begin

     Assign(f, ’f.txt’);

     Rename(f, ‘address.dat’);

end.

 Процедури та функції, призначені для пошуку файлів на діску, керування атребутами файла тощо, означені у бібліотечних модулях dos та windos.

Контрольні питання

1. Фізичний і логічний файли

2. Технологія роботи з файлами

3. Типи файлів і оголошення файлових змінних

4. Установка відповідності між фізичним і логічним файлами

5. Відкриття та закриття файлів

6. Зчитування і запис текстових файлів

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


 

А также другие работы, которые могут Вас заинтересовать

63928. Проблемы определения уголовно-процессуального статуса лиц, подвергаемых уголовному преследованию 415.83 KB
  УПК РФ процессуальная деятельность осуществляемая стороной обвинения в целях изобличения подозреваемого обвиняемого в совершении преступления именуется как уголовное преследование. УПК РФ контроль и запись переговоров допускается производить только по уголовным делам...
63929. Характеристика бухгалтерского учета материально-производственных запасов на ООО «Талар» 883.82 KB
  Анализ состояния производственных запасов структура и динамика материально-производственных запасов; коэффициент обеспеченности материально-производственными запасами; оценка потребности в материальных ресурсах; оценка эффективности использования материальных ресурсов материалоемкость продукции...
63930. Анализ дебиторской и кредиторской задолженности на предприятии ОАО «Молоко» 385.06 KB
  В условиях нестабильной рыночной экономики риск неоплаты или несвоевременной оплаты счетов увеличивается это приводит к появлению дебиторской и кредиторской задолженности. Часть этой задолженности в процессе финансово –хозяйственной деятельности...
63931. Развитие скоростно-силовых качеств у баскетболистов старшего школьного возраста 3.87 MB
  Цель исследования – охарактеризовать развитие скоростно-силовых качеств у баскетболистов старшего школьного возраста. Задачи исследования: На основе анализа литературных источников выявить основные особенности скоростно- силовых качеств баскетболистов старшего школьного возраста...
63933. Проблем рынка пластиковых карт в России на примере ОАО «РГС Банк» 493.5 KB
  Теоретические аспекты функционирования платёжных систем на основе пластиковых карт. Правовое регулирование деятельности кредитных организаций в области пластиковых карт. Виды пластиковых карт и их характеристика.
63934. Корупція на міжнародному рівні та на рівні законодавства України 176.78 KB
  Мета і завдання дослідження полягає у тому, щоб на основі вивчення, аналізу й узагальнення новітнього законодавства у сфері протидії корупції, думок з приводу цієї проблематики вчених, міжнародно – правових стандартів показати способи протидії корупції у різних державах...
63935. Принципы окрашивания волос 650.59 KB
  Изменение моды на прически вызывает изменение моды на цвет волос. Независимо от того почему красятся волосы: желание ли это скрыть седину или же просто с декоративной целью в любом случае необходимо стремиться к созданию естественных тонов.
63936. Совершенствование методов управления в ООО «Про-Сервис» 369 KB
  Цель данного исследования – на основе проведенного анализа стиля руководства и методов управления в ООО «Про-Сервис» разработать предложения по их совершенствованию. Для достижения цели данного исследования необходимо решить следующие задачи: Рассмотреть сущность стилей руководства и методов управления в организации...