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

  Юрій  | 

  Оновл. 27 Кві 2021  | 

 203

Функціонал потоків вводу/виводу не визначений як частина мови 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++ поставляється з 4-ма попередньо визначеними стандартними об’єктами потоків, які ви можете використовувати (перші три ви вже зустрічали):

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

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

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

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

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

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

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

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

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

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

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

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