Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції на ОП та алг. мови.doc
Скачиваний:
13
Добавлен:
03.11.2018
Размер:
785.92 Кб
Скачать

Переміщення по файлу

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

Seek

Truncate

і три додаткові функції

FileSize

FilePos

Eof

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

Після виконання процедури Seek подальші операції читання чи запису будуть проводитися, починаючи з установленої позиції покажчика.

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

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

Seek(F,FiiePos(F)+l){ пропуск одного елемента }

Seek(F,0){ установка покажчика на початок файлу }

Seek (F, FileSize (F)) { установка поточного покажчика безпосередньо за останнім елементом файлу; це може служити вихідною позицією для додавання елементів у "хвіст" файлу }

Функція eof викликається з одним параметром — файлової змінної — повертає логічне значення true чи false у залежності від того, чи досягнутий кінець файлу. Якщо файл використовувався для читання, то виникнення ситуації "кінець файлу" (і, відповідно, значення true, що повертається функцією eof) означає, що всі елементи файлу прочитані. При записі у файл істинність функції eof буде означати, що чергова операція запису помістить інформацію в кінець даного файлу.

Нарешті, процедура Truncate використовується для відсікання від файлу його хвостової частини, що починається від поточної позиції покажчика включно. Єдиний параметр процедури Truncate - файлова змінна, відповідна файлу, що усікається.

Спеціальні операції

Дана група операцій призначена для дій з елементами файлової системи MS-DOS - каталогами й іменами файлів, дозволяючи створювати і видаляти каталоги, видаляти і перейменовувати файли, працювати з атрибутами файлів і т.д. Докладне пояснення цих операцій можна знайти у фірмових посібниках з мови, а тут обмежимося вказівкою імен деяких процедур:

Erase - видалення файлу на диску.

Rename -перейменування файлу.

ChDir - установити поточний каталог.

MkDir - створити новий (під)каталог.

RmDir - видалити порожній (під)каталог.

Текстові файли

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

Текст у файлі зберігається у виді послідовності символів (char), для розбивки тексту на рядки використовуються невидимі при перегляду символи кінця рядка.

1. Оголошення файлової змінної і прив'язка до файлу на диску

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

var f: text;

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

Перш ніж працювати з конкретним файлом на диску, файлову змінну варто зв'язати з цим файлом, використовуючи таку процедуру:

assign(TxtFile: text, name: string);

Перший параметр (TxtFile) — файлова змінна, другий — рядок, що містить ім'я файлу на диску. Якщо файл лежить у поточному каталозі, то досить указати тільки його ім'я і розширення, якщо в якому-небудь іншому, то потрібно вказувати шлях до цього файлу, наприклад:

assign(f,'Z:\SCHOOL\text1.txt');

2. Читання даних з файлу

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

Щоб відкрити для читання файл, що був зазначений при виклику assign, потрібно використовувати процедуру

reset(TxtFile: text);

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

Після відкриття файлу можна починати читання даних. Для цього використовуються процедури read і readln, що використовуються в наступному форматі:

read(TxtFile: text, v1: type1, v2: type2, ... vN: typeN);

readln(TxtFile: text, v1: type1, v2: type2, ... vN: typeN);

Перша процедура читає послідовно з файлу значення і поміщає їх у змінні v1, v2, ... v. Після кожного прочитаного значення покажчик файлу зміщується до початку наступного значення. Процедура readln робить те ж саме, після чого переміщує покажчик на початок наступної рядка; readln з одним лише першим параметром переводить покажчик на початок нового рядка. Як параметри для процедур read і readln можна використовувати змінні наступних типів:

  • цілі: integer, byte, shortint, word, longint;

  • дійсні: real, single, double, extended, comp;

  • рядкові (string);

  • символьні (char).

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

При читанні чисел read і readln працюють так: спочатку покажчик пропускає всі пробіли і символи табуляції, а потім, знайшовши перший значущий символ, намагається прочитати число. Якщо це неможливо (зустрілася буква чи число записане невірно), то відбудеться помилка.

Приклад використання процедури читання:

var f: text; s: string; n: integer;

...

readln(f,n,s);

Необхідно пам'ятати, що якщо файл не був відкритий для читання за допомогою reset, то будь-яка спроба прочитати з нього дані приведе до помилки.

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

eoln(TxtFile: text): boolean;

eof(TxtFile: text): boolean;

Перша приймає значення true (істина), якщо покажчик стоїть на кінці рядка, друга — те ж саме для кінця файлу.

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

close(TxtFile: text);

якщо цього не зробити, то уміст файлу може виявитися зіпсованим після виконання нашої програми.

Приклад 1 (процедури читання). Нехай мається текстовий файл, наприклад програма на Паскалі. Потрібно роздрукувати його вміст на екрані:

program ShowFile;

var f: text;

c: char;

begin

assign(f,'showfile.pas');

reset(f);

while not eof(f) do

begin

while not eoln(f) do

begin

read(f,c);

write(c);

end;

readln(f);

writeln;

end;

close(f);

readln;

end.

3. Запис даних у файл

А тепер перейдемо до процедур запису у файл. Перед тим як що-небудь записувати, потрібно створити новий (порожній)файл чи стерти вміст існуючого. Для цього використовується процедура

rewrite(TxtFile: text);

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

Для запису використовуються процедури

write(TxtFile: text, p1: type1, p2: type2, ... pN: typeN);

writeln(TxtFile: text, p1: type1, p2: type2, ... p: type);

Тут як параметри p1, p2, ... p можна використовувати не тільки змінні, але і вирази: числових типів, рядкові, символьні і логічні (boolean). На відміну від write, writeln після запису у файл значень p1, p2, ... p переводить покажчик запису на початок нового рядка; writeln з одним параметром (текстовий файл) лише переводить покажчик на новий рядок.

Так само як і у випадку з читанням з файлу, після того як усі дані записані файл потрібно закрити за допомогою close.

Приклад 2 (запис у файл). Нехай даний довільний текстовий файл, потрібно одержати інший файл, у кожнім рядку якого записана довжина відповідної рядка вихідного файлу:

program WriteLength;

var f1,f2: text;

s: string;

begin

assign(f1,'writelen.pas'); reset(f1);

assign(f2,'result.txt'); rewrite(f2);

while not eof(f1) do

begin

readln(f1,s);

writeln(f2,length(s));

end;

close(f1); close(f2);

end.

Ще один спосіб запису — це відкриття для додавання інформації в кінець файлу. Для цього використовується процедура

append(TxtFile: text);

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