Слайд 1“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В., 2014, mail:
korpy@ukr.net
Лекція № 8
Основи роботи з файлами
Зміст
6. Основи роботи з
файлами
6.1. Оголошення файлу(файлової змінної).
6.2. Призначення файловій змінній імені.
6.3. Вивід даних у файл.
6.4. Відкриття файлу для виводу даних
6.5. Помилки відкриття файлу
6.6. Закриття файлу
6.7. Зчитування з файлу
6.8. Читання даних з файлу
6.9. Мітка кінця файлу
Слайд 2“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №
8
Можна стверджувати, що вся робота комп’ютера зводиться до маніпуляцій з
файлами, а точніше з даними, що міститься в них. Практично будь яка програма повинна взаємодіяти з файловою системою комп’ютера і більш того, здійснювати базові операції вводу-виводу(I/O routines).
Що розуміється під операціями вводу-виводу? Це дії, що пов’язані з створенням нового або відкриттям існуючого файлу, з операціями читання з файлу або записом в нього інформації, з копіюванням, переміщенням і видаленням файлу тощо.
Програми, які до цього часу ми розглядали, виводили результат своєї роботи на екран. Разом з тим, Delphi дозволяє зберігати результати роботи програми на диску комп'ютера, у файлі, що дає можливість використовувати ці дані для подальшої обробки.
Файл — це структура даних що має ім’я, та містить послідовність елементів даних одного типу, причому кількість елементів послідовності практично не обмежена. У першому наближенні файл можна розглядати як масив змінної довжини необмеженого розміру.
Слайд 3“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Класифікація
типів файлів
Всі існуючи типи файлів розділяються на три напрямки:
Текстові файли.
Типізовані
файли.
Двійкові (нетипизовані) файли.
Текстовий файл спеціалізується на збереження текстової інформації, представленої в символах ASCII.
6.1. Оголошення файлу(файлової змінної)
Робота з любим типом файлу вимагає визначення – файлової змінної, яка використовується в якості аргументу в багатьох методах вводу-виводу. Спосіб оголошення файлової змінної визначається типом файлу, на який буде вказувати наша змінна.
Як і будь-яка структура даних (змінна, масив) програми, файл повинен бути оголошений в розділі опису змінних. При оголошенні файлу указується тип елементів файлу.
У загальному вигляді оголошення файлу виглядає так:
Ім’я: File of <Тип елементів>;
Приклади:
res: file of char; // файл символів
koef: file of real; // файл дійсних чисел
f: file of integer; // файл цілих чисел
Слайд 4“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Файл,
компонентами якого є дані символьного типу, називається символьним, або текстовим.
Опис текстового файлу в загальному вигляді виглядає так:
Ім’я: TextFile;
де:
ім'я — ім'я файлової змінної;
TextFile — позначення - типу, який вказує, що Ім'я — це файлова змінна, яка представляє текстовий файл.
Самий універсальний формат файла – двійковий. Це файли графіки, аудіо- і відеофайли, електронні таблиці, HTML-файли, можно сказати всі існуючи файли. Текстові і типізовані файли представляють собою частковий випадок двійкового файлу.
Для оголошення файлової змінної двійкового файлу використовують наступний запис:
var DataFile: File;
Нетипизовані файли дуже часто використовуються при рішенні задач, в яких немає необхідності аналізу вмісту цих файлів, наприклад в операціях копіювання або переміщення файлу.
Слайд 5“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
6.2.
Призначення файловій змінній імені.
Оголошення файлової змінної задає тільки тип компонентів
файлу. Для того, щоб програма могла виводити дані у файл або прочитувати дані з файлу, необхідно вказати конкретний файл, тобто пов'язати файлову змінну з конкретним файлом (задати ім'я файлу).
Ім'я файлу задається викликом процедури AssignFile, що пов'язує файлову змінну з конкретним файлом.
Опис процедури AssignFile виглядає наступним чином:
AssignFile(var f, Ім’я файла: string)
Ім'я файлу задається згідно прийнятим в Windows правилам. Воно може бути повним, тобто складатися не тільки безпосередньо з імені файлу, але і включати шлях до файлу (ім'я диска, каталогів і підкаталогів).
Нижче приведені приклади виклику процедури AssignFiie:
AssignFile(f, 'a:\result.txt');
AssignFile(f, '\students\ivanov\koreni.txt');
fname:=('zvit.txt');
AssignFile(f,fname);
Слайд 6“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
6.3.
Вивід даних у файл
Безпосередньо вивід в текстовий файл здійснюється за
допомогою інструкції write або writeln. У загальному вигляді ці інструкції записуються таким чином:
write (Файлова змінна, Список виводу) ;
writeln (Файлова змінна, Список виводу);
де:
Файлова змінна — це змінна, що ідентифікує файл, в який виконується вивід;
Список виводу – це розділені комами імена змінних, значення яких треба вивести у файл. Окрім імен змінних в список виводу можна включати стрічкові константи.
Наприклад, якщо змінна f є змінною типу TextFiie, то інструкція виводу значень змінних x1 і х2 у файл може бути такій:
write(f, 'Корені рівняння', x1, х2);
Відмінність між інструкціями write і writeln полягає в тому, що інструкція writeln після виведення всіх значень, вказаних в списку виводу, записує у файл символ "новий рядок".
Слайд 7“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
6.4.
Відкриття файлу для виводу
Перед виводом у файл його необхідно відкрити.
Якщо програма, що формує вихідний файл, вже використовувалася, то можливо, що файл з результатами роботи програми вже є на диску. Тому програміст повинен вирішити, як поступити із старим файлом: замінити старі дані новими або нові дані додати до старих. Спосіб використання старого варіанту визначається під час відкриття файлу.
Можливі наступні режими відкриття файлу для запису в нього даних:
перезапис (запис нового файлу поверх того, що існує або створення нового файлу);
додавання в існуючий файл.
Для того, щоб відкрити файл в режимі створення нового файлу або заміни що існує, необхідно викликати процедуру Rewrite(f), де f — файлова змінна типу TextFile.
Для того, щоб відкрити файл в режимі додавання до вже існуючих даних, що знаходяться в цьому файлі, потрібно викликати процедуру Append(f), де f — файлова змінна типу TextFile.
На мал. 6.1 приведено діалогове вікно програми, яка виконує запис або додавання в текстовий файл.
Слайд 8“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
У
лістингу 6.1 приведена процедура, яка запускається натисненням командної кнопки Записати.
Вона відкриває файл в режимі створення нового або заміщення існуючого файлу і записує текст, що знаходиться в полі компоненту Memo1.
Ім'я файлу можна ввести безпосередньо в коді або через компоненту в полі Edit1. Можна задати зумовлене ім'я файлу під час розробки форми додатку. Для цього треба привласнити значення, наприклад data.txt, властивості Edit1.Text.
Слайд 9“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Лістинг
6.1. Створення нового або заміщення існуючого файлу
procedure TFMainOOP.BtnSaveFileClick(Sender: TObject);
var
f:
TextFile; // файл
fName: String[80]; // ім'я файлу
i: integer;
Begin
fName := 'data.txt';
AssignFile(f, fName);
Rewrite(f); // відкрити для перезапису
// запис у файл
for i := 0 to MemViewList.Lines.Count do // рядки нумеруються з нуля
writeln(f, MemViewList.Lines[i]+#13+#10);
CloseFile(f); // закрити файл
MessageDlg('Дані ЗАПИСАНІ у файл ', mtInformation,[mbOk],0);
end;
Слайд 10“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
У
лістингу 6.2 приведена процедура, яка запускається натисненням командної кнопки Додати.
Вона відкриває файл, ім'я якого вказане в полі Edit1, і додає в нього вміст поля Memo1.
Лістинг 6.2. Додавання в існуючий файл
// Клік на кнопці Додати
procedure TFMainOOP.BtnAddDataFileClick(Sender: TObject);
var
f: TextFile; // файл
fName: String[80];// ім'я файлу
i: integer;
begin
fName := 'data.txt';
AssignFile(f, fName);
Append(f); // відкрити для додавання
// запис у файл
for i:=0 to MemViewList.Lines.Count do // рядки нумеруються з нуля
writeln(f, MemViewList.Lines[i]+#13+#10);
CloseFile(f); // закрити файл
MessageDlg('Дані ДОДАНІ у файл ', mtInformation, [mbOk], 0);
end;
Слайд 11“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
6.5.
Помилки відкриття файлу
Спроба відкрити файл може завершитися невдачею і викликати
помилку часу виконання програми. Причин невдачі при відкритті файлів може бути декілька. Наприклад, програма спробує відкрити файл на гнучкому диску, який не готовий до роботи (не закрита шторка накопичувача, або диск не вставлений в накопичувач). Інша причина — відсутність файлу, що відкривається в режимі додавання (файлу немає — додавати нeма куди).
При запуску програми з Delphi у разі помилки під час відкриття файлу виникає виключення, і на екрані з'являється діалогове вікно з повідомленням (мал. 6.2).
Рис. 6.2. Приклад повідомлення про помилку відкриття файлу (програма запущена з Delphi)
Слайд 12“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Якщо
програма запускається з Windows, то вікно з повідомленням про помилку
виглядає інакше (мал. 6.3).
Рис. 6.3. Приклад повідомлення про помилку відкриття файлу . (програма запущена з Windows)
Програма може узяти на себе завдання контролю за результатом виконання інструкції відкриття файлу. Зробити це можна, перевіривши значення функції IOResult (input-Output Result — результат введення/виводу). Функція IOResuit повертає 0, якщо операція введення/виводу завершилася успішно; інакше — код помилки (не нуль).
Слайд 13“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Для
того, щоб програма змогла перевірити результат виконання операції введення/виводу, потрібно
дозволити їй це робити. Для цього треба перед інструкцією виклику процедури відкриття файлу помістити директиву компілятору — рядок {$I-}, який забороняє автоматичну обробку помилок введення/виводу. Ця директива повідомляє компілятор, що програма бере на себе контроль помилок. Після інструкції відкриття файлу слід помістити директиву {$I+}, поновлюючу режим автоматичної обробки помилок введення/виводу.
На мал. 6.4 приведена блок-схема алгоритму відкриття файлу для додавання, що забезпечує створення файлу (і що тим самим знімає помилку, що виникає при спробі відкрити неіснуючий файл) у випадку, якщо файлу, що відкривається для додавання, на диску ще немає.
Рис. 6.4. Алгоритм відкрття файлу з обробкою можливої помилки
Слайд 14“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Нижче
приведений фрагмент програми, що реалізовує приведений вище алгоритм відкриття файлу.
AssignFile(f,filename);
{$I-}
Append(f)
// відкрити для додавання
{$I+}
if IOResult<> 0 // помилка відкриття
then Rewrite(f); // відкрити для запису
// відкрити існуючий або новий файл
Слайд 15“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Перед
завершенням роботи програма повинна закрити всі відкриті файли. Це робиться
викликом процедури close. Процедура close має один параметр — ім'я файлової змінної. Приклад використання процедури:
Close(f);
6.6. Закриття файлу
Слайд 16“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Програма
може вводити початкові дані не тільки з клавіатури, але і
з текстового файлу. Для того, щоб скористатися цією можливістю, потрібно оголосити файлову змінну типу TextFile, призначити їй за допомогою інструкції AssignFile ім'я файлу, з якого будуть читатися дані, відкрити файл для читання (введення) і прочитати (ввести) дані, використовуючи інструкцію read або readln.
6.7. Зчитування з файлу
Відкриття файлу для введення (читання) виконується викликом процедури Reset, що має один параметр — файлову змінну. Перед викликом процедури Reset за допомогою функції AssignFile файлова змінна повинна бути пов'язана з конкретним файлом.
Наприклад, наступні інструкції відкривають файл для введення:
AssignFile(f, 'c:\data.txt');
Reset(f);
Відкриття файлу
Слайд 17“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Якщо
ім'я файлу вказане невірно, наприклад файлу з вказаним ім'ям на
диску немає, то виникає помилка часу виконання програми. Слід зазначити, що іншою причиною виникнення помилки при відкритті файлу, що знаходиться на гнучкому диску, може бути відсутність готовності дисковода, простіше кажучи, відсутність диска в накопичувачі.
Тому в програмі слід передбачити можливість повторної спроби відкриття файлу після підтвердження повторення операції.
Як і при відкритті файлу для запису, програма може узяти на себе завдання обробки можливої помилки при відкритті файлу, перевіряючи значення функції IOResult.
Фрагмент програми, текст якого приведений в лістингу 6.4, використовує значення функції lOResult для перевірки результату відкриття файлу. Якщо спроба відкрити файл викликає помилку, то програма виводить діалогове вікно з повідомленням про помилку і запитом на підтвердження повторного відкриття файлу.
Слайд 18“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Лістинг
6.4. Обробка помилки відкриття файлу (фрагмент програми)
var
fname : string[80];
// ім'я файлу
f : TextFile; // файл
res : integer; // код помилки відкриття файлу (значення lOResult)
answ : word; // відповідь користувача
begin
fname := 'a:\test.txt';
AssignFile (f, fname);
repeat
{$I-}
Reset(f); // відкрити файл для читання
{$I+}
res:=IOResult;
if res <> 0 then
answ:= MessageDlg('Помилка відкриття '+ fname+#13 +'Повторити
спробу?',mtWarning, [mbYes, mbNo],0); until (res= 0) OR
(answ = mrNo);
if res <> 0
then exit; // завершення процедури
// тут інструкції, які виконуються
// у разі успішного відкриття файлу
end;
Слайд 19“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Читання
з файлу виконується за допомогою інструкцій read і readln, які
в загальному вигляді записуються таким чином:
read( Файлова змінна, Список змінних);
readln( Файлова змінна, Список змінних);
де:
Файлова змінна — змінна типу TextFile;
Список змінних — імена змінних, розділені комами.
6.8. Зчитyвання даних з файлу
Слайд 20“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Слід
розуміти, що в текстовому файлі знаходяться не числа, а їх
зображення. Дія, що виконується інструкціями read або readln, фактично складається з двох частин: спочатку з файлу читаються символи до появи роздільника (пропуску або кінця рядка), потім прочитані символи, числа, що є зображенням, перетворяться в число, і набутого значення привласнюється змінною, ім'я якої вказане як параметр інструкції read або readln.
Наприклад, якщо текстовий файл а:\data.txt містить наступні рядки:
23 15 45 28 56 71
то в результаті виконання інструкцій:
AssignFile(f, 'a:\data.txt');
Reset(f); // відкрити для читання
read(f, а); read(f, b, c); read(f, d);
значення змінних будуть наступними: а = 23, b = 15, з = 45, d = 28.
Зчитування чисел
Слайд 21“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №6-7
Відмінність
інструкції readln від read полягає в тому, що після прочитування
з файлу чергового числа і привласнення набутого значення змінній, ім'я якої стоїть останнім в списку параметрів інструкції readin, покажчик читання з файлу автоматично переміщається в початок наступного рядка файлу, навіть в тому випадку, якщо за прочитаним числом є ще числа.
Тому в результаті виконання інструкцій
AssignFile(f,'a:\data.txt');
Reset(f);
readln(f, а);
readln(f, b, c);
readln(f, d);
значення змінних будуть наступними: а = 23, b = 45, з = 28, d = 56.
Якщо при читанні значення чисельної змінної у файлі замість зображення числа буде якась інша послідовність символів, то відбудеться помилка.
Слайд 22“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
У
програмі стрічкова змінна може бути оголошена з вказівкою довжини або
без неї.
Наприклад:
strichka1:string[10];
strichka2:string;
При читанні з файлу значення стрічкової змінної, довжина якої явно задана в її оголошенні, прочитується стільки символів, скільки вказано в оголошенні, але не більше, ніж в поточному рядку.
При читанні з файлу значення стрічкової змінної, довжина якої явно не задана в оголошенні змінній, значенням змінної стає частина поточного рядка, що залишилася після останнього читання. Іншими словами, якщо треба прочитати з файлу весь рядок, то оголосите строкову змінну, довжина якої свідомо більше що найдовшого рядка файлу, і прочитуйте рядки в цю змінну.
Якщо однією інструкцією readln здійснюється введення декілька, наприклад, дві змінних, то перша змінна міститиме стільки символів, скільки вказано в її оголошенні або, якщо довжина не вказана, весь рядок файлу. Друга змінна міститиме символи поточного рядка, що залишилися, або, якщо таких символів немає, не міститиме жодного символу (довжина рядка рівна нулю).
Зчитування стрічок
Слайд 23“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Хай
на диску є деякий текстовий файл. Потрібно в діалогове вікно
вивести вміст цього файлу. Рішення задачі задоволене очевидно: треба відкрити файл, прочитати перший рядок, потім другий, третій і так далі до тих пір, поки не буде досягнутий кінець файлу. Але як визначити, що прочитаний останній рядок, досягнутий кінець файлу?
Для визначення кінця файлу можна скористатися функцією EOF (End of File — кінець файлу). У функції EOF один параметр — файлова змінна. Значення функції EOF рівне False, якщо прочитаний елемент даних не є останнім у файлі, тобто можливе подальше читання. Якщо прочитаний елемент даних є останнім, то значення EOF рівне True.
Значення функції EOF можна перевірити відразу після відкриття файлу. Якщо при цьому воно опиниться рівним True, то це означає, що файл не містить жодного елементу даних, тобто є порожнім (розмір такого файлу рівний нулю).
6.9. Мітка кінця файлу
Слайд 24“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №6-7
У
лістингу 6.5 приведена процедура, яка виконує поставлене завдання. Вона читає
рядки з файлу, ім'я якого ввів користувач під час роботи програми, і виводить ці рядки в полі Memo. Вікно програми приведене на мал. 6.6.
Рис. 6.6. Вікно програми Зчитування з файлу
Слайд 25“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №6-7
Лістинг
6.5. Читання з файлу
unit rd_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
procedure Button2Click(Sender: TObject);
procedure ButtonlClick(Sender: TObject); private
{ Private declarations ) public
{ Public declarations } end;
var
Form1: Tform1;
implementation
Слайд 26“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
{$R
*.dfm}
// клацання на кнопці Відкрити
procedure TFMainOOP.BtnReadListClick(Sender: TObject);
var
f: TextFile;
// файл
fName: String[80]; // ім'я файлу
buf: String[80]; // буфер для читання з файлу
begin
fName := 'data.txt';
AssignFile(f, fName);
{$I-}
Reset(f); // відкрити для читання
{$I+}
if IOResult <> 0 then
begin
MessageDlg('Помилка доступу до файлу ' + fName, mtError, [mbOk], 0);
exit;
end;
// читання з файлу
while not EOF(f) do begin
readln(f, buf); // прочитати рядок з файлу
MemViewList.Lines.Add(buf); // додати рядок в полі Memo1
end;
CloseFile(f); // закрити файл
end;
Слайд 27“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №6-7
//
клацання на кнопці Зберегти — запис у файл
procedure Tform1.Button2Click(Sender:
TObject);
var
f: TextFile; // файл
fName: String[80]; // ім'я файлу
i: integer;
begin
fName := Edit1.Text;
AssignFile(f, fName);
Rewrite(f); // відкрити для перезапису
// запис у файл
for i:=0 to Memo1.Lines.Count do // рядки нумеруються з нуля
writeln(f, Memo1.Lines[i]);
CloseFile(f); // закрити файл
MessageDlg('Дані записані у файл ', mtlnformation, [mbOk], 0);
end;
end.
Слайд 28“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Слайд 29“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Для
організації обробки файлу використана інструкція циклу while, яка забезпечує перевірку
значення функції EOF перед кожним читанням, у тому числі і перед першим.
Наявність кнопки Зберегти і відповідної нею процедури дозволяє зберегти вміст поля Memo у файлі, тобто програма читання з файлу є примітивний редактор тексту.
Додавання чергового прочитаного з файлу рядка в полі Memo виконується застосуванням методу Add до властивості Lines.
Слайд 30“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Алгоритм
роботи з текстовим файлом
Слайд 31Що таке файли?
Для чого призначена файлова змінна
Запис даних у файл
Зчитування даних з файлу
Для чого призначена функція lOResult
Мітка кінця файлу
“Застосування
засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №8
Питання:
Слайд 32 Література:
Гради Буч Обьектно-ориентированный анализ и
проектирование с примерами приложений на С++. 2002 г. - 250
с.
Миронченко А.С. Императивное и обьектно-ориентированое программирование на Turbo Pascal и Delphi.
Т.А. Павловская Паскаль. Программирование на языке высокого уровня.: Учебник для вузов. – СПб.: Питер, 2007. -393 с. Ил.
Архангельский А.Я. Программирование в Delphi для Windows. Версии 2006, 2007, Turbo Delphi, 2007 г. - 1248 с.
Гофман В. Э., Хомоненко А. Д. Delphi. Быстрый старт. — СПб.: БХВ-Петербург, 2003. — 288 с: ил.
Шупрута В.В. Delphi 2005. Учимся программировать.
“Застосування засобів ООП в лінгвістичних задачах” Корпильов Д.В. 2014
Лекція №4