Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3 Мб
Скачать
☆
  1. Організація файлового введення-виведення даних

У С++-системі введення-виведення також передбачено засоби для виконання відповідних операцій з використанням файлів. Файлові операції введення-виве- дення даних можна реалізувати після внесення у програму заголовка <fstream>, у якому визначено всі необхідні для цього класи і значення.

  1. Відкриття та закриття файлу

У мові програмування C++ файл відкривається шляхом зв'язування його з по­током. Як уже зазначалося вище, існують потоки трьох типів: введення, виведен­ня і введення-виведення. Щоб відкрити вхідний потік, необхідно оголосити потік класу ifstream. Для відкриття вихідного потоку потрібно оголосити потік класу ofstream. Потік, який передбачається використовувати для операцій як введення, так і виведення, повинен бути оголошений як потік класу fstream. Наприклад, у процесі виконання такого фрагмента коду програми буде створено вхідний і ви­хідний потоки, а також потік, що дає змогу виконувати операції в обох напрямах: ifstream in; // Вхідний потік ofstream out; // Вихідний потік fstream both; // Потік введення-виведення

Щоб відкрити файл, використовується функція ореп().

Створивши потік, його потрібно пов'язати з файлом. Це можна зробити за до­помогою функції ореп(), причому у кожному з трьох потокових класів є своя фун- кція-член ореп(). їх прототипи мають такий вигляд:

void ifstream::open(const char*filename, ios::openmode mode = ios::in);

void ofstream::open(const char* filename, ios::openmode mode = ios::out | ios::trunc);

void fstream::open(const char*filename, ios::openmode mode = ios::in | ios::out);

У цих записах елемент filename означає ім'я файлу, яке може містити специфі­катор шляху, що вказує доступ до нього. Елемент mode називається специфікато­ром режиму, який визначає спосіб відкриття файлу. Він повинен приймати одне або декілька значень перерахунку openmode, який визначено у класі ios:

  • ios::арр - приєднує до кінця файлу усі дані, що виводяться;

  • ios::ate - пошук потрібних даних починатиметься з кінця файлу;

  • ios::binary - відкриває файл у двійковому режимі;

  • ios::in - забезпечує відкриття файлу для введення даних;

  • ios::out - забезпечує відкриття файлу для виведення даних

  • ios::trunc - призводить до руйнування вмісту файлу.

Декілька значень перерахунку openmode можна об'єднувати за допомогою ло­гічного додавання (АБО).

Вартоа' нати'.аПараметр mode для функції fstream::open() за замовчуванням може не дорівнювати значенню ІП \ out (це залежить від використовуваного компілятора). Тому у разі потреби цей параметр Вам доведеться задавати безпосередньо.

Нео! хідноапам ятати! За замовчуванням усі файли відкриваються в тек­стовому режимі.

  1. Внесення значення ios::app у параметр mode забезпечить приєднання до кінця файлу всіх даних, які виводяться. Це значення можна застосовувати тільки до файлів, відкритих для виведення даних.

  2. Під час відкриття файлу з використанням значення ios::ate пошук потрібних да­них починатиметься з кінця файлу. Незважаючи на це, операції введення-виве- дення даних можуть, як і раніше, виконуватися по всьому файлу.

  3. Значення ios::binary дає змогу відкрити файл у двійковому режимі. Як уже зазна­чалося вище, в текстовому режимі можуть відбуватися деякі перетворення сим­волів (наприклад, послідовність, що складається з символів повернення каретки і переходу на новий рядок, може бути перетворена у символ нового рядка). Під час відкриття файлу у двійковому режимі ніякого перетворення символів не здійснюється.

  4. Значення ios::in вказує на те, що цей файл відкривається для введення даних, а значення ios::out забезпечує відкриття файлу для виведення даних.

  5. Використання значення ios::trunc призводить до руйнування вмісту файлу, ім'я якого збігається з параметром filename, а сам цей файл урізається до нульової до­вжини. При створенні вихідного потоку типу ofstream будь-який наявний файл з іменем filename автоматично урізається до нульової довжини.

Вартоа натиі Будь-який файл, що містить форматний текст або ще не- оброблені дані, можна відкрити як у двійковому, так і в текстовому режимі. Єдина відмінність між цими режимами полягає у перетворенні (чи ні) симво­лів.

У процесі виконання такий фрагмент коду програми відкриває звичайний ви­хідний файл:

ofstream myStream; out.openfTecT");

Оскільки параметру mode функції орепО за замовчуванням встановлює значен­ня, яке дорівнює відповідному типу потоку, який відкривається, то у наведеному вище прикладі взагалі немає потреби задавати його значення.

У результаті невдалого виконання функції орепО не відкритому потоку при використанні булевого виразу встановлюється значення, яке дорівнює ФАЛЬШ. Такий механізм може слугувати для підтвердження успішного відкриття файлу, наприклад, за допомогою такої if-настанови: if(!myStream) {

cout«"Не вдається відкрити файл" « endl;

// оброблення помилки

_}

Нео! хідноапам ятати'.аПеред спробою отримання доступу до даних файла, необхідно завжди перевіряти результат виклику функції ореп().

Рекомендується також перевірити факт успішного відкриття файлу за допо­могою функції is_open(), яка є членом класів fstream, ifstream і ofstream. Її прототип має такий вигляд: bool is_open();

Ця функція повертає значення ІСТИНА, якщо потік пов'язаний з відкритим файлом, і ФАЛЬШ - в іншому випадку. Наприклад, використовуючи такий фраг­мент коду програми, можна дізнатися про те, чи відкрито у цей момент потоковий об'єкт myStream:

if (! my Stream. is_o pe n 0) {

cout«"Файл не відкрито" « endl;

//...

}

Хоча цілком коректно використовувати функцію орепО для відкриття файлу, проте здебільшого це робиться по-іншому, оскільки класи ifstream, ofstream і fstream містять конструктори, які автоматично відкривають заданий файл. Параметри у цих конструкторів і їх значення (що діють за замовчуванням) збігаються з пара­метрами і відповідними значеннями функції орепО- Тому найчастіше файл відкри­вається так, як це показано в наведеному нижче прикладі: ifstream myStreamfmyFile"); // Файл відкривається для введення

Якщо з якоїсь причини файл відкрити неможливо, то потоковій змінній, що пов'язується з цим файлом, встановлюється значення, яке дорівнює ФАЛЬШ.

Щоб закрити файл, використовується функція-член close(). Наприклад, щоб закрити файл, який пов'язано з потоковим об'єктом myStream, потрібно використа­ти таку настанову: myStream.closeO;

Функція closeO не має параметрів і не повертає ніякого значення.