Урок №215. Потоки вводу і виводу

  Юрій  | 

  Оновл. 9 Жов 2021  | 

 326

Функціонал потоків вводу/виводу не визначений як частина мови C++, а надається Стандартною бібліотекою C++ (і знаходиться в просторі імен std). На попередніх уроках ми підключали заголовковий файл бібліотеки iostream і використовували об’єкти cin і cout для простого вводу та виводу даних. На цьому уроці ми детально розглянемо бібліотеку iostream.

Бібліотека iostream

При підключенні заголовку iostream, ми отримуємо доступ до всієї ієрархії класів бібліотеки iostream, які відповідають за функціонал вводу/виводу даних (включаючи клас, який називається iostream). Ієрархія цих класів виглядає приблизно наступним чином:

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

Потоки в С++

Друге, що ви могли б помітити — це часте використання слова «stream» (тобто «потік»). По суті, ввід/вивід в мові C++ реалізований за допомогою потоків. Абстрактно, потік — це послідовність символів, до яких можна отримати доступ. З часом потік може надавати або споживати потенційно необмежені обсяги даних.

Ми матимемо справу з двома типами потоків:

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

   Потік виводу (або «вихідний потік») використовується для зберігання даних, наданих конкретному споживачеві даних: монітору, файлу, принтеру тощо. При запису даних на пристрій виводу, цей пристрій може бути не готовим прийняти дані негайно. Наприклад, принтер все ще може прогріватися, коли програма вже записує дані в вихідний потік. Таким чином, дані перебуватимуть в потоці виводу до тих пір, поки принтер не почне їх використовувати.

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

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

Ввід/вивід в C++

Хоча клас ios є дочірнім класу ios_base, дуже часто саме цей клас буде найбільш батьківським класом, з яким ви працюватимете/взаємодіятимете напряму. Клас ios визначає купу різних речей, які є загальними для потоків вводу/виводу.

Клас istream використовується для роботи з вхідними потоками. Оператор вилучення >> використовується для вилучення значень з потоку. В цьому є сенс: коли користувач натискає на клавішу клавіатури, код цієї клавіші поміщається у вхідний потік. Потім програма витягує це значення з потоку і використовує його.

Клас ostream використовується для роботи з вихідними потоками. Оператор вставки << використовується для вставки значень в потік. В цьому також є сенс: ви вставляєте свої значення в потік, а потім споживач даних (наприклад, монітор) використовує їх.

Клас iostream може обробляти як ввід, так і вивід даних, що дозволяє йому здійснювати двонаправлений ввід/вивід.

Нарешті, залишилися 3 класи, які закінчуються на _withassign. Ці потокові класи є дочірніми класами istream, ostream і iostream (відповідно). У більшості випадків ви не працюватимете з ними напряму.

Стандартні потоки в C++

Стандартний потік — це попередньо підключений потік, який надається програмі її оточенням. Мова C++ поставляється з чотирма попередньо визначеними стандартними об’єктами потоків, які ви можете використовувати (перші три ви вже зустрічали):

   cin — клас istream_withassign, пов’язаний зі стандартним вводом (зазвичай це клавіатура);

   cout — клас ostream_withassign, пов’язаний зі стандартним виводом (зазвичай це монітор);

   cerr — клас ostream_withassign, пов’язаний зі стандартною помилкою (зазвичай це монітор), який забезпечує небуферизований вивід;

   clog — клас ostream_withassign, пов’язаний зі стандартною помилкою (зазвичай це монітор), який забезпечує буферизований вивід.

Небуферизований вивід зазвичай обробляється відразу ж, тоді як буферизований вивід зазвичай зберігається і виводиться як блок. Оскільки clog використовується рідко, то його зазвичай ігнорують.

Приклад на практиці

Ось приклад використання вводу/виводу даних зі стандартними потоками:

На наступних уроках ми детально розглянемо функціонал потоків вводу/виводу.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *