- •Основи програмування мовою Паскаль
- •Часть 1. Основы языка Паскаль 2
- •Часть 2. Элементы профессионального программирования на Паскалі 62
- •Частина 1. Основи мови Паскаль
- •1. Алгоритм і програма
- •1.1. Алгоритм
- •1.2. Властивості алгоритму
- •1.3. Форми запису алгоритму
- •1.4. Програма й програмне забезпечення
- •1.5. Етапи розробки програми
- •2. Дані в мові Паскаль
- •2.1 Константи
- •2.2 Змінні й типи змінних
- •3. Арифметичні вирази
- •4. Лінійний обчислювальний процес
- •4.1 Оператор присвоювання
- •4.2 Оператор уведення
- •4.3 Оператор виведення
- •4.4 Керування виводом даних
- •4.5 Вивід на друк
- •5. Структура простої програми на Паскалі
- •6. Компілятор і оболонка Turbo Pascal
- •7. Обчислювальний процес, що розгалужується, і умовний оператор
- •7.4. Короткий умовний оператор
- •If логічний_вираз then оператор1;
- •7.5. Повний умовний оператор
- •If логічний_вираз then оператор1
- •7.7. Вкладені умовні оператори
- •7.9. Приклади програм з умовним оператором
- •8. Директиви компілятора й обробка помилок уведення
- •9. Оператор циклу. Цикли із передумовою і після-умовою
- •10. Цикл із лічильником і дострокове завершення циклів
- •11. Типові алгоритми табулювання функцій, обчислення кількості, суми й добутку
- •11.1 Алгоритм табулювання
- •11.2 Алгоритм організації лічильника
- •11.3 Алгоритми нагромадження суми й добутку
- •12. Типові алгоритми пошуку максимуму й мінімуму
- •13. Розв'язок навчальних завдань на цикли
- •14. Одномірні масиви. Опис, уведення, вивід і обробка масивів на Паскалі
- •15. Розв'язок типових завдань на масиви
- •Частина 2. Елементи професійного програмування на Паскалі
- •16. Кратні цикли
- •16.1 Подвійний цикл і типові завдання на подвійний цикл
- •16.2 Оператор безумовного переходу
- •17. Матриці й типові алгоритми обробки матриць
- •18. Підпрограми
- •18.1 Процедури
- •18.2 Функції
- •18.3 Масиви як параметри підпрограми
- •18.4 Відкриті масиви
- •19. Безлічі й перечислимые типи
- •20. Обробка символьних і строкових даних
- •20.1. Робота із символами
- •20.2 Робота з рядками
- •21. Текстові файли
- •21.1 Загальні операції
- •21.2 Приклади роботи з файлами
- •21.3 Робота з параметрами командного рядка
- •22. Записи. Бінарні файли
- •23. Модулі. Створення модулів
- •23.1. Призначення й структура модулів
- •Implementation
- •23.2. Стандартні модулі Паскаля
- •24. Модуль crt і створення простих інтерфейсів
- •25. Модуль Graph і створення графіки на Паскалі
- •Додаток 1. Таблиці Ascii-Кодів символів для операційних систем dos і Windows
- •Додаток 2. Основні директиви компілятора Паскаля
- •Додаток 3. Основні повідомлення про помилки Паскаля
- •Додаток 4. Додаткові лістинги програм
- •Додаток 5. Розширені коди клавіатури
- •Ascii‑ коди
- •Розширені коди
- •Додаток 6. Правила гарного коду
- •Додаток 7. Рекомендована література
21. Текстові файли
Для написання більшості складних програм потрібен обмін даними з файлами. У цій главі ми розглянемо тільки текстові файли, для роботи з бінарними й типізованими файлами див. спеціальну літературу й главу 22.
21.1 Загальні операції
Для роботи з кожним файлом описується змінна типу text:
var f:text;
Її називають файловою змінної. Якщо програма використовує кілька файлів одночасно, для кожного з них описується така змінна. Можна використовувати й одну змінну для декількох файлів, якщо вони обробляються послідовно, і кожний наступний файл відкривається після завершення роботи з попереднім. Уся робота з файлом відбувається через файлову змінну, ім'я файлу нам доведеться вказати тільки один раз наступним оператором:
assign (f,'ім'я_файлу');
де f– раніше описана файлова змінна.
Цей оператор передує відкриттю файлу й зв'язує файлову змінну з файлом на твердому або гнучкому диску. У якості імені файлу може бути зазначене фіксоване ім'я:
assign (f,'data.txt');{буде відкриватися файл із іменем data.txt з поточної папки}
assign (f,'a:\my.dat');{буде відкриватися файл my.dat з кореневої папки дискети}
Ім'я файлу також може бути введене користувачем із клавіатури:
Var name:string; f:text;
Begin
Writeln ('Уведіть ім'я файлу:');
Readln (name);
Assign (f,name);
. . .
або передане програмі параметром командного рядка (див. п. 5.3).
Після зв'язування слід відкритифайл. Кожний файл може бути відкритий тільки в одному із трьох режимів – длячитанняданих, длязаписунових даних ( при цьому, якщо файл уже існував, його колишній уміст буде стертий) або длядодаванняданих у кінець файлу. Якщо потрібно спочатку прочитати дані з файлу, а потім переписати цей же файл, слід відкрити файл для читання, після читання закрити його й знову відкрити для запису. Відкриття файлу виконується одним із трьох операторів:
reset (f);- відкрити для читання
rewrite (f);- відкрити для запису
append (f);– відкрити для додавання
Читання або запис данихздійснюється знайомими нам операторамиread, readln, write і writeln, алепершим параметромцих операторів вказується ім'я файлової змінної:
Var a,b,c:real; f1,f2:text;
Begin
Assign (f1,'read.txt');
Assign (f2,'write.txt');
Reset (f1); {відкрили файл read.txt з поточної папки}
Rewrite (f2); { для читання, а файл write.txt для запису}
Read (f1,a,b); {Прочитали 2 числа з файлу read.txt}
C:=(a+b)/2;
Writeln (f2,c:6:2); {записали значення c і переклад рядка у файл write.txt}
. . .
Після того, як усі операції з файлом виконані, його слід закрити, особливо якщо відбувався запис або додавання даних:
close(f);{закрили файл, пов'язаний з файлової змінноїf}
При роботі з файлами можуть виникнути помилки, зв'язані як з відсутністю потрібного файлу на диску, так і із проблемами читання або записи (наприклад, ми намагаємося відкрити файл для запису на захищеному від запису диску). Тому оператори відкриття файлу й читання або записи даних слід захищати директивою компілятора {$I-}. . .{$I+}, а після оператора перевіряти статус операції введення-виведення за допомогою стандартної функціїIoresult:
var f:text; name,s:string;
begin
writeln ('Уведіть ім'я файлу для відкриття:');
readln (name);
assign (f,name);
{$I-}reset(f);{$I+}
if Ioresult<>0 then begin
writeln ('Не можу відкрити файл ',name,' для читання!');
writeln ('Натисніть Enter для виходу із програми');
readln;
halt;
end;
readln(f,s);
writeln ('Перший рядок цього файлу виглядає так:');
writeln (s);
close(f);
writeln ('Натисніть Enter для виходу із програми');
readln; end.
У подальших прикладах ми для стислості не завжди будемо виконувати ці перевірки, але гарний стиль програмування припускає, що у своїх програмах Ви будете їх робити.
При читанні з файлів найчастіше обсяг, що читаються даних невідомий заздалегідь. Тому необхідна функція, що вміє визначати, чи прочитані вже всі дані:
Function Eof(Var F : Text) : Boolean;- повертає істину, якщо при читанні досягнуться кінець файлу
Function Eoln (Var F : Text) : Boolean;- повертає істину, якщо при читанні досягнуться кінець рядка
Як правило, основний цикл читання файлу із заздалегідь невідомою кількістю рядків виглядає так:
While not eof (f) do begin
{оператори для читання рядків файлу й роботи з ними}
End;
При читанні з одного файлу "змішаних" строкових і числових даних слід перевіряти, дійсно чи в потрібних рядках файлу втримуються числа. Для цього можна використовувати стандартну процедуру val. Як правило,форматфайлів, що розуміються тієї або інший програмою, вибирається програмістом, і важливо передбачити реакцію програми на помилковий формат вихідних даних. Допустимо, наша програма являє собою найпростіший телефонний довідник, що включає імена абонентів і по одному телефонному номеру на кожне ім'я. Формат файлу, що зберігає дані довідника, також виберемо найпростішим:
Прізвище1
Номер1
Прізвище2
Номер2
і т.д., тобто, у рядках 1,3,5,… файлу втримуються прізвища абонентів, а в рядках 2,4,6,… їх номера телефонів. Приймемо також, що файл довідника називається phones.txt, існує й перебуває в тій же папці, звідки запускається програма.
var f:text;
name,phone,search:string;
number,strings:longint; error:integer; found:boolean;
begin
assign (f,'phones.txt');
reset(f);
writeln ('Уведіть прізвище абонента для пошуку:');
readln (search);
strings:=1; {Лічильник прочитаних рядків файлу}
found:=false; {Перемикач станів "знайдене"-"не знайдене"}
while not eof(f) do begin
readln (f,name); {Прочитали прізвище}
readln (f,phone); {Прочитали номер}
val (phone,number,error);
{Пробуємо номер-рядок перетворити в число}
if error<>0 then begin {якщо це не вдалося зробити - помилка}
Writeln ('Помилка - немає номера телефону! Номер рядка=', strings);
Writeln ('Натисніть Enter для виходу із програми');
Readln;
Halt;
end;
if name=search then begin
writeln ('Телефон знайдений:',number);
found:=true;
break;
end;
strings:=strings+1;
end;
close (f);
if found=false then writeln ('Телефон не знайдений!');
Writeln ('Натисніть Enter для виходу із програми');
Readln;
end.
Зрозуміло, цій програмі бракує як уміння редагувати, що відкривається їй довідник, так і гнучкості при пошуку – наприклад, вона розрізняє як різні символи рядкові й прописні букви в прізвищі, що вводиться.