- •Потоки та файли
- •Основи файлової системи
- •Закриття файлу
- •Запис символу: putc() і fputc()
- •Читання символу: getc() і fgetc()
- •Використання fopen(), getc(), putc(), і fclose()
- •Використання feof ()
- •Введення/виведення рядків: fputs () і fgets ()
- •Int fputs (const char * cmp, file * pf); char * fgets (char * cmp, int довжина, file * pf);
- •Функція rewind ()
- •Функція ferror ()
- •Функції fprinf () і fscanf ()
- •Введення-виведення при прямому доступі: функція fseek ()
- •Int fseek (file * pf, long int коліч_байт, int начало_отсчета);
- •Виведення у файловий потік
- •Запис у вихідний файловий потік
- •Читання з вхідного файлового потоку
- •Перевірка помилок при виконання файлових операцій
- •Виконання операцій читання і запису
- •Зауваження та рекомендації
ФАЙЛОВЕ ВВЕДЕННЯ/ВИВЕДЕННЯ В С І С++
У мові С система введення/виведення реалізується за допомогою бібліотечних функцій, а не ключових слів. Завдяки цьому система введення/виведення є дуже потужною і гнучкою. Наприклад, під час роботи з файлами дані можуть передаватися або у своєму внутрішньому двійковому поданні, або в текстовому форматі, тобто в більш зрозумілому людині вигляді. Це полегшує завдання створення файлів у потрібному форматі.
Оскільки С є фундаментом C++, то іноді виникає плутанина у відносинах його файлової системи з аналогічною системою C++.
По-перше, C++ підтримує всю файлову систему С. Таким чином, при переміщенні старішого С-коду в C++ немає необхідності міняти всі процедури введення/виведення.
По-друге, слід мати на увазі, що в C++ визначена своя власна, об'єктно-орієнтована система введення/виведення, в яку входять як функції, так і оператори введення/виведення. В системі введення/виведення C++ повністю підтримуються всі можливості аналогічної системи С і це робить зайвою файлову систему мови С. Взагалі кажучи, при написанні програм мовою C++ зазвичай більш зручно використовувати саме його систему введення/виведення, але, якщо необхідно скористатися файловою системою мови С, то це також цілком можливо.
Потоки та файли
Перед тим як почати вивчення файлової системи мови С, необхідно з'ясувати, в чому різниця між потоками і файлами. В системі введення/виведення С для програм підтримується єдиний інтерфейс, що не залежить від того, до якого конкретного пристрою здійснюється доступ. Тобто в цій системі між програмою і пристроєм знаходиться щось більш загальне, ніж сам пристрій. Такий узагальнений пристрій введення або виведення (пристрій більш високого рівня абстракції) називається потоком, в той час як конкретний пристрій називається файлом (файл – теж поняття абстрактне.) Дуже важливо розуміти, яким чином відбувається взаємодія потоків і файлів.
Потоки
Файлова система мови С призначена для роботи з різними пристроями, в тому числі терміналами, дисководами і накопичувачами на магнітній стрічці. Навіть якщо якийсь пристрій сильно відрізняється від інших, буферизована файлова система все одно надасть його у вигляді логічного пристрою, який називається потоком. Всі потоки поводяться схожим чином. І оскільки вони в основному не залежать від фізичних пристроїв, то та ж функція, яка виконує запис в дисковий файл, може ту ж операцію виконувати і на іншому пристрої, наприклад, на консолі.
Потоки бувають двох видів: текстові і двійкові.
Текстовий потік – це послідовність символів. У стандарті С вважається, що текстовий потік організований у вигляді рядків, кожен з яких закінчується символом нового рядка. Проте в кінці останнього рядка цей символ не є обов'язковим. В текстовому потоці на вимогу базового середовища можуть відбуватися певні перетворення символів. Наприклад, символ нового рядка може бути замінений парою символів – повернення каретки та переведення рядка. Тому може і не бути однозначної відповідності між символами, які пишуться (читаються), і тими, які зберігаються в зовнішньому пристрої. Крім того, кількість тих символів, які пишуться (читаються), і тих, які зберігаються в зовнішньому пристрої, може також не співпадати із-за можливих перетворень.
Двійковий потік – це послідовність байтів, яка взаємно однозначно відповідає байтам на зовнішньому пристрої, причому ніякого перетворення символів не відбувається. Крім того, кількість тих байтів, які пишуться (читаються), і тих, які зберігаються на зовнішньому пристрої, однакова. Однак наприкінці двійкового потоку може додаватися визначена додатком кількість нульових байтів. Такі нульові байти, наприклад, можуть використовуватися для заповнення вільного місця в блоці пам'яті незначущою інформацією, щоб вона в точності заповнила сектор на диску.
Файли
У мові С файлом може бути все що завгодно, починаючи з дискового файлу і закінчуючи терміналом або принтером. Потік пов'язують з певним файлом, виконуючи операцію відкриття. Як тільки файл відкритий, можна проводити обмін інформацією між ним і програмою.
Але не у всіх файлів однакові можливості. Наприклад, до дискового файлу прямий доступ можливий, у той час як до деяких принтерів – ні. Таким чином, ми прийшли до одного важливого принципу, що належить до системи введення/виведення мови С: всі потоки однакові, а файли – ні.
Якщо файл може підтримувати запити на місце розташування (покажчик поточної позиції), то при відкритті такого файлу покажчик поточної позиції у файлі встановлюється в початок. При читанні з файлу (або запис в нього) кожного символу покажчик поточної позиції збільшується, забезпечуючи просування по файлу.
Файл від'єднується від певного потоку (тобто розривається зв'язок між файлом і потоком) за допомогою операції закриття. При закритті файлу, відкритого з метою виведення, вміст (якщо він є) пов'язаного з ним потоку записується на зовнішній пристрій. Цей процес, який зазвичай називають дозапису потоку, гарантує, що ніяка інформація випадково не залишиться в буфері диска. Якщо програма завершує роботу нормально, тобто або main() повертає керування операційній системі, або викликається exit(), то всі файли закриваються автоматично. У разі аварійного завершення роботи програми, наприклад, у разі краху або завершення шляхом виклику abort(), файли не закриваються.
У кожного потоку, пов'язаного з файлом, є керуюча структура, яка містить інформацію про файл, вона має тип FILE. У цьому блоці управління файлом ніколи нічого міняти не можна.
Для новачків у програмуванні розмежування потоків і файлів може здатися зайвим чи навіть "зарозумілим". Однак треба пам'ятати, що основна мета такого розмежування – це забезпечити єдиний інтерфейс. Для виконання всіх операцій введення/виведення слід використовувати тільки поняття потоків і застосовувати лише одну файлову систему. Введення або виведення від кожного пристрою автоматично перетвориться системою введення/виведення в легко керований потік.