
- •Програмування і алгоритмічні мови Конспект лекцій
- •Луцьк 2004
- •Лекція 1 Основи мови с. Оператори введення та виводу.
- •Імена змінних та типи і розміри даних. Арифметичні та логічні оператори. Оператори присвоєння.
- •Лекція 3 Масиви. Масиви літер.
- •Умовні оператори. Інкриментні та декрементні оператори.
- •Цикл For
- •Лекція 6 Цикли While, Do-while.
- •Препроцесор. Рекурсія.
- •Структури. Масив структур.
- •Основні відомості про функції.
- •Змінні і правила дії областей у функціях
- •Головні файли.
- •Масиви в якості аргументів функції.
- •Структури в якості аргументів функції
- •Вказівники і адреси
- •Масиви вказівників
- •Вказівники на структуру
- •Лекція 17 Використання вказівників у якості аргументів функцій
- •Лекція 18 Доступ до файлів
- •Методичне видання
- •“Автоматизоване управління технологічними процесами”
- •Тир.50 прим. Зам.1516
- •43018, М.Луцьк, вул. Львівська, 75
Лекція 18 Доступ до файлів
Усі дотепер написані програми читали зі стандартного введення і писали в стандартний висновок, щодо яких ми припускали, що вони надані програмі місцевою операційною системою.
Питання полягає в тому, як організувати читання з іменованих файлів, тобто, як зв'язати зовнішні імена, з фактично читаючими даними операторами.
Ці правила прості. Перш ніж можна зчитувати з деякого файлу чи записувати в нього, цей файл повинний бути відкритий за допомогою функції FOPEN зі стандартної бібліотеки. Функція FOPEN бере зовнішнє ім'я проводить деякі обслуговуючі дії і повертає внутрішнє ім'я, що повинне використовуватися при наступних читаннях з файлу чи записах у нього.
Це внутрішнє ім'я, назване "вказівником файлу", фактично є вказівником структури, що містить інформацію про файл, таку як місце розміщення буфера, чи відбувається читання з файла чи запис у нього. Користувачі не зобов'язані знати ці деталі, тому що серед визначень для стандартного введення-висновку, одержуваних з файла STDIO.H, міститься визначення структури з ім'ям FILE. Єдине необхідне для вказівника файла опис, який демонструється прикладом:
FILE *FOPEN(), *FP;
Тут говориться, що FP є вказівником на FILE і FOPEN повертає вказівник на FILE. Зверніть увагу, що FILE є ім'ям типу, подібним INT.
Фактичне звертання до функції FOPEN у програмі має вид:
FP=FOPEN(NAME,MODE);
Першим аргументом функції FOPEN є "ім'я" файлу, що задається у виді символьного рядка. Другий аргумент MODE ("режим") також є символьним рядком, що вказує, як цей файл буде використовуватися. Припустимими режимами є: читання ("R"), запис ("W") і додавання ("A").
Якщо ви відкриєте файл, що ще не існує, для запису чи додавання, то такий файл буде створений. Відкриття існуючого файлу на запис приводить до відкидання його старого вмісту. Спроба читання неіснуючого файла є помилкою. Помилки можуть бути обумовлені й іншими причинами (наприклад, спробою читання з файла, не маючи на те дозволу). При наявності якої-небудь помилки функція повертає нульове значення вказівника NULL (яке для зручності також визначається у файлі STDIO.H).
Іншою необхідною річчю є спосіб читання чи запису, якщо файл уже відкритий. Тут є кілька можливостей, з яких GETC і PUTC є найпростішими.
Функція GETC повертає наступний символ з файлу; їй необхідний вказівник файлу, щоб знати, з якого файлу читати. Таким чином,
C=GETC(FP)
розміщує в C наступний символ з файлу, зазначеного за допомогою FP.
Функція PUTC,
PUTC(C,FP)
розміщує символ C у файл FP. Подібно функціям GETCHAR і PUTCHAR, GETC і PUTC можуть бути макросами, а не функціями.
При запуску програми автоматично відкриваються три файли, що володіють визначеними вказівниками файлів. Цими файлами є стандартне введення, стандартний вивід і стандартний вивід помилок; відповідні вказівники файлів називаються STDIN, STDOUT і STDERR. Звичайно всі ці вказівники зв'язані з терміналом, але STDIN і STDOUT можуть бути переспрямовані на файли в потік (PIPE).
Функції GETCHAR і PUTCHAR можуть бути визначені в терміналах GETC, PUTC, STDIN і STDOUT у такий спосіб: #DEFINE GETCHAR() GETC(STDIN) #DEFINE PUTCHAR(C) PUTC(C, STDOUT)
При роботі з файлами для форматного введення і виведення можна використовувати функції FSCANF і FPRINTF. Вони ідентичні функціям SCANF і PRINTF, за винятком того, що першим аргументом є вказівник файлу, що визначає той файл в який буде вестися запис; керуючий рядок буде другим аргументом.
Приклад:
#INCLUDE <STDIO.H>
MAIN(ARGC, ARGV) /*CAT: CONCATENATE FILES*/
INT ARGC;
CHAR *ARGV[];
{
FILE *FP, *FOPEN();
IF(ARGC==1) /*NO ARGS; COPY STANDARD INPUT*/
FILECOPY(STDIN);
ELSE
WHILE (--ARGC > 0)
IF ((FP=FOPEN(*++ARGV,"R"))==NULL) {
PRINTF("CAT:CAN'T OPEN %\N",*ARGV);
BREAK;
} ELSE }
FILECOPY(FP);
FCLOSE(FP);
}
}
FILECOPY(FP) /*COPY FILE FP TO STANDARD OUTPUT*/
FILE *FP;
}
INT C;
WHILE ((C=GETC(FP)) !=EOF)
PUTC(C, STDOUT);
}
Вказівники файлів STDIN і STDOUT заздалегідь визначені в бібліотеці введення-виведення як стандартне введення і стандартне виведення; вони можуть бути використані в будь-якому місці, де можна використовувати об'єкт типу FILE* вони однак є константами, а не змінними.
Функція FCLOSE є зворотною стосовно FOPEN; вона розриває зв'язок між вказівником файла і зовнішнім ім'ям, установлений функцією FOPEN, і вивільняє вказівник файла для іншого файла. Більшість операційних систем мають деякі обмеження на число одночасно відкритих файлів.