Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 9 (Файли).docx
Скачиваний:
29
Добавлен:
16.05.2015
Размер:
64.85 Кб
Скачать

ФАЙЛОВЕ ВВЕДЕННЯ/ВИВЕДЕННЯ В С І С++

У мові С система введення/виведення реалізується за допомогою бібліотечних функцій, а не ключових слів. Завдяки цьому система введення/виведення є дуже потужною і гнучкою. Наприклад, під час роботи з файлами дані можуть передаватися або у своєму внутрішньому двійковому поданні, або в текстовому форматі, тобто в більш зрозумілому людині вигляді. Це полегшує завдання створення файлів у потрібному форматі.

Оскільки С є фундаментом C++, то іноді виникає плутанина у відносинах його файлової системи з аналогічною системою C++.

По-перше, C++ підтримує всю файлову систему С. Таким чином, при переміщенні старішого С-коду в C++ немає необхідності міняти всі процедури введення/виведення.

По-друге, слід мати на увазі, що в C++ визначена своя власна, об'єктно-орієнтована система введення/виведення, в яку входять як функції, так і оператори введення/виведення. В системі введення/виведення C++ повністю підтримуються всі можливості аналогічної системи С і це робить зайвою файлову систему мови С. Взагалі кажучи, при написанні програм мовою C++ зазвичай більш зручно використовувати саме його систему введення/виведення, але, якщо необхідно скористатися файловою системою мови С, то це також цілком можливо.

Потоки та файли

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

Потоки

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

Потоки бувають двох видів: текстові і двійкові.

Текстовий потік – це послідовність символів. У стандарті С вважається, що текстовий потік організований у вигляді рядків, кожен з яких закінчується символом нового рядка. Проте в кінці останнього рядка цей символ не є обов'язковим. В текстовому потоці на вимогу базового середовища можуть відбуватися певні перетворення символів. Наприклад, символ нового рядка може бути замінений парою символів – повернення каретки та переведення рядка. Тому може і не бути однозначної відповідності між символами, які пишуться (читаються), і тими, які зберігаються в зовнішньому пристрої. Крім того, кількість тих символів, які пишуться (читаються), і тих, які зберігаються в зовнішньому пристрої, може також не співпадати із-за можливих перетворень.

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

Файли

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

Але не у всіх файлів однакові можливості. Наприклад, до дискового файлу прямий доступ можливий, у той час як до деяких принтерів – ні. Таким чином, ми прийшли до одного важливого принципу, що належить до системи введення/виведення мови С: всі потоки однакові, а файли – ні.

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

Файл від'єднується від певного потоку (тобто розривається зв'язок між файлом і потоком) за допомогою операції закриття. При закритті файлу, відкритого з метою виведення, вміст (якщо він є) пов'язаного з ним потоку записується на зовнішній пристрій. Цей процес, який зазвичай називають дозапису потоку, гарантує, що ніяка інформація випадково не залишиться в буфері диска. Якщо програма завершує роботу нормально, тобто або main() повертає керування операційній системі, або викликається exit(), то всі файли закриваються автоматично. У разі аварійного завершення роботи програми, наприклад, у разі краху або завершення шляхом виклику abort(), файли не закриваються.

У кожного потоку, пов'язаного з файлом, є керуюча структура, яка містить інформацію про файл, вона має тип FILE. У цьому блоці управління файлом ніколи нічого міняти не можна.

Для новачків у програмуванні розмежування потоків і файлів може здатися зайвим чи навіть "зарозумілим". Однак треба пам'ятати, що основна мета такого розмежування – це забезпечити єдиний інтерфейс. Для виконання всіх операцій введення/виведення слід використовувати тільки поняття потоків і застосовувати лише одну файлову систему. Введення або виведення від кожного пристрою автоматично перетвориться системою введення/виведення в легко керований потік.