Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

19.5.8. Перевірка статусу введення-виведення

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

Ім'я

Значення

ios::goodbit

Помилок немає

ios::eofbit

1 внаслідок виявлення кінця файлу; 0 – в іншому випадку

ios::failbit

1 під час виникнення поправної помилки введення-виведення; 0 – в іншому випадку

ios::badbit

1 під час виникнення непоправної помилки введення-виведення; 0 – в іншому випадку

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

iostate rdstate();

Функція rdstate() повертає поточний статус прапорців помилок. Неважко здогадатися, що, судячи з наведеного вище переліку прапорців, функція rdstate() поверне значення goodbit за відсутності будь-яких помилок. У іншому випадку вона повертає відповідний прапорець помилки.

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

  • функція bool bad(); повертає значення ІСТИНА, якщо внаслідок виконання операції введення-виведення даних було встановлено прапорець badbit;

  • функцію bool eof(); розглянуто вище;

  • функція bool fail(); повертає значення ІСТИНА, якщо внаслідок виконання операції введення-виведення даних було встановлено прапорець failbit;

  • функція bool good(); повертає значення ІСТИНА, якщо у процесі виконання операції введення-виведення даних помилок не відбулося.

У інших випадках ці функції повертають значення ФАЛЬШ.

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

void clear(iostate flags = ios::goodbit);

Якщо параметр flags дорівнює значенню goodbit(воно встановлюється за замовчуванням), то всі прапорці помилок очищаються. Інакше прапорці встановлюються відповідно до заданого Вами значення.

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

19.6. Використання файлів довільного доступу

Дотепер ми використовували файли, доступ до вмісту яких було організовано строго послідовно, байт за байтом. Але у мові програмування C++ також можна отримувати доступ до файлу у довільному порядку.

19.6.1. Функції довільного доступу

Для довільного доступу до доданих файлу необхідно використовувати функції seekg() і seekp(). Їх прототипи мають такий вигляд:

istream &seekg(off_type offset, seekdir origin);

ostream &seekp(off_type offset, seekdir origin);

Використовуваний тут цілочисельний тип off_type (він визначений у класі ios) дає змогу зберігати найбільше допустиме значення, яке може мати параметр offset. Тип seekdir визначено як перерахунок, який має наступні значення.

Значення

Опис

ios::beg

Початок файлу

ios::cur

Поточна позиція файлу

ios::end

Кінець файлу

Функція seekg() переміщає покажчик, що "відповідає" за введення даних, а функція seekp() – покажчик, що "відповідає" за виведення.

У С++-системі введення-виведення передбачено можливість керування двома покажчиками, пов'язаними з файлом. Ці так звані get- і put-покажчики визначають, у якому місці файлу повинна виконатися наступна операція введення та виведення відповідно. Під час кожного виконанні операції введення або виведення відповідний покажчик автоматично переміщається у вказану позицію. Використовуючи функції seekg() і seekp(), можна отримувати доступ до файлу у довільному порядку.

1. Функція seekg() переміщає поточний get-покажчик відповідного файлу на offset байт відносно позиції, які задаються параметром origin.

2. Функція seekp() переміщає поточний put-покажчик відповідного файлу на offset байт відносно позиції, які задаються параметром origin.

Варто знати! У загальному випадку довільний доступ для операцій введення-виведення даних повинен виконуватися тільки для файлів, відкритих у двійковому режимі. Перетворення символів, які можуть відбуватися в текстових файлах, можуть призвести до того, що запрошувана позиція файлу не відповідатиме його реальному вмісту.

Поточну позицію кожного файлового покажчика можна визначити за допомогою таких двох функцій:

  • pos_type tellg(); повертає поточну позицію get-покажчика;

  • pos_type tellp(); повертає поточну позицію put-покажчика.

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

Існують перевантажені версії функцій seekg() і seekp(), які переміщають файлові покажчики у позиції файлу, що задаються значеннями, які повертаються функціями tellg() і tellp()відповідно. Ось як виглядають їх прототипи:

istream &seekg(pos_type position);

ostream &seekp(pos_type position);