Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lec_11_Pres.doc
Скачиваний:
4
Добавлен:
05.12.2018
Размер:
377.86 Кб
Скачать

3. Відкриття/закриття потоків

3.1. Відкриття потоків.

Функція fopen (). Перед тим, як виконувати введення даних з конкретного файла або запис даних у файл, необхідно створити окремий потік, пов'язаний з цим фізичним файлом. Створення потоку реалізує функція відкриття файлу, прототип якої оголошено так:

FILE* fopen (char* fname, char* fmode);

Функція створює новий потік і пов'язує його з фізичним файлом, заданим іменем fname. Параметр fmode задає режими обміну даними. За умови успішного відкриття потоку створюється спеціальна структура зі шаблоном FILE, оголошеним через декларацію typedef у заголовному файлі <stdio.h>. Поля цієї структури заповнюються інформацією про відкритий файл і створений потік, необхідною для організації файлового введення/виведення в конкретному операційному середовищі. Функція повертає адресу (вказівник) створеної та заповненої даними структури FILE.

Якщо ж потік відкрити не вдалось (найчастіше це буває через неправильно задане ім'я файлу або хибний шлях), то структура FILE не створюється, a fopen () повертає порожній вказівник NULL.

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

A:\LABROBC\delwords.cpp

у формі символьного рядка треба записувати так:

"А:\\LABROBC\\delwords.cpp"

Другий параметр функції fopen () - fmode задає спосіб відкриття файлу (потоку) і характер наступних операцій обміну зі створеним потоком. Основними режимами відкриття є:

  • "r" - файл відкривається для читання;

  • "w" - файл відкривається для запису;

  • "а" - файл відкривається для доповнення.

Режим "r" передбачає, що файл, який треба відкрити, вже існує, інакше фіксується помилка і fopen () повертає значення NULL. Режим "w" призначений для створення нового файлу, якщо ж файл зі заданим іменем вже є в робочому каталозі, то його вміст буде витертий. Щоб унеможливити випадкове витирання однойменного файлу, треба попередньо перевірити, чи такий файл існує Режим "а" зберігає вміст існуючого файлу, а якщо файл зі заданим іменем відсутній, то створює новий файл.

До ключової літери кожного режиму відкриття можна додати знак +, а саме

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

Додатково в параметрі fmode можна вказати літеру t або b, якими задаються відповідно текстовий чи бінарний (двійковий) режим відкриття потоку. За правилами замовчування автоматично встановлюється текстовий режим. Різниця між двома режимами полягає тільки в інтерпретації двобайтової комбінації символів з кодами 0xd і 0ха ("повернення каретки" і "новий рядок"), якою позначається натискання клавіші Enter

Якщо файловий обмін виконується в текстовому режимі, то дана комбінація в процесі читання замінюється одним символом нового рядка “\n”, а в разі запису навпаки –кожен символ “\n” заноситься у потік як двобайтова комбінація "\r\n". У бінарних режимах такі заміни не виконуються. Оскільки у файлах, що містять двійкові коди числових даних, імовірна поява двох сусідніх байтів, значення яких відповідають комбінації "\r\n", то, щоб уникнути їх перетворення, треба встановити бінарний режим відкриття потоку, наприклад: "rb" або "w+b" (останній режим можна позначити еквівалентною формою запису: "wb+").

Наведемо приклад відкриття потоку з перевіркою коректності результату.

FILE *fp; /* вказівник потоку */

char *fname="report.txt"; /* ім'я файлу */

fp = fopen(fname, "rt");

if (fp==NULL) /* потік відкрити не вдалось */

{ printf ("Файл %s не знайдено\n", fname); return 0;

}

. . . /* Дії з відкритим файлом */

Кожен потік повинен мати свій вказівник з типом FILE *, який зберігає адресу структури, заповненої даними про відкритий файл і пов'язаний з ним потік Цей вказівник надалі ми називатимемо просто вказівником потоку.

3.2. Закриття потоків.

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

int fclose (FILE* fp);

Функція має один параметр fp - вказівник на потік, який треба закрити. У разі успішного виконання fclose () повертає значення 0. Якщо ж потік закрити не вдалось (це може трапитись через витирання файла або відсутність вільного місця на диску), то fclose () повертає макроконстанту EOF, оголошену в <stdio.h>.

У більшості систем програмування, в т.ч. у Borland C, значенням макроконстанти EOF є -1, але це значення не стандартизоване.

Система програмування Borland C додатково підтримує функцію

int fcloseall (void);

яка закриває відразу всі потоки, відкриті в програмі на даний момент. Функція повертає кількість закритих потоків, а в разі помилки закриття файлів - EOF.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]