67368

Потоки. Класи потоків С++

Лекция

Информатика, кибернетика и программирование

На сьогодні існують дві версії бібліотеки об'єктно-орієнтованого введення-виведення даних, причому обидві широко використовуються програмістами: стара, що базується на оригінальних специфікаціях мови C, і нова – визначається стандартом мови програмування C++.

Украинкский

2014-09-07

177.5 KB

5 чел.

Лекція № 26

Тема: Потоки. Класи потоків С++

План

1. Порівняння C- та С++-систем введення-виведення

2. Поняття "потоків" у мові програмування C++

3. Файлові С++-потоки

4. Вбудовані С++-потоки

5. Класи потоків

  1.  Порівняння C- та С++-систем введення-виведення

   На сьогодні існують дві версії бібліотеки об'єктно-орієнтованого введення-виведення даних, причому обидві широко використовуються програмістами: стара, що базується на оригінальних специфікаціях мови C, і нова – визначається стандартом мови програмування C++. Стара бібліотека введення-виведення даних підтримується за рахунок заголовного файлу <iostream.h>, а нова – за допомогою заголовка <iostream>. Нова бібліотека введення-виведення даних загалом є оновленою і вдосконаленою версією старої. Основна відмінність між ними полягає в механізмі реалізації засобів введення-виведення потокової інформації, а не

у тому, як їх потрібно використовувати.

    З погляду програміста, є дві істотні відмінності між старою С- і новою С++-бібліотеками введення-виведення. По-перше, нова бібліотека містить ряд додаткових засобів і визначає декілька нових типів даних. Тому нову бібліотеку С++-системи введення-виведення можна вважати надбудовою над старою С-системою.

    Практично всі програми, що були написані раніше з використанням старої бібліотеки, успішно компілюються тепер за наявності нової бібліотеки, не вимагаючи внесення будь-яких значних змін у самій програмі. По-друге, стара бібліотека С-системи введення-виведення була визначена в глобальному просторі імен, а нова використовує простір імен std (пригадайте, що простір імен std використовується всіма бібліотеками стандарту мови програмування C++). Оскільки С-бібліотека введення-виведення даних вже дещо застаріла, то у цьому навчальному посібнику описується тільки нова її версія. Водночас велика частина наведеного нижче матеріалу повною мірою стосується і старої бібліотеки.

 

  1.  Поняття "потоків" у мові програмування C++

   Принциповим для розуміння С++-системи введення-виведення є те, що вона базується на понятті "потоку". Потік (stream) – це загальний логічний інтерфейс з різними пристроями, з яких складається комп'ютер. Потік або синтезує інформацію, або споживає її, після чого зв'язується з будь-яким фізичним пристроєм за допомогою С++-системи введення-виведення. Характер поведінки всіх потоків є однаковим, незважаючи на різні фізичні пристрої, з якими вони пов'язуються. Оскільки різні потоки діють однаково, то практично до всіх типів пристроїв можна застосувати одні і ті ж самі функції та оператори введення-виведення. Наприклад, методи, що використовуються для виведення даних на екран, також можна використовувати для виведення їх на друкувальний пристрій або для запису у дисковий файл.

  1.  Файлові С++-потоки

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

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

    Розглядаючи потоки, необхідно розуміти, що вкладається у поняття "поточної позиції". Наприклад, якщо довжина файлу дорівнює 100 байтів, і відомо, що вже прочитано його половину, то наступна операція зчитування почнеться на 50-му байті, який у цьому випадку і є поточною позицією.

    Отже, у мові програмування C++ механізм введення-виведення потокової інформації функціонує з використанням логічного інтерфейсу, який називається потоком. Всі потоки мають аналогічні властивості, які дають змогу використовувати однакові функції введення-виведення, незалежно від того, з файлом якого типу існує зв'язок. Під файлом розуміють реальний фізичний пристрій, який містить дані. Якщо файли можуть відрізнятися між собою, то потоки – ні. Водночас, якщо деякі пристрої можуть не підтримувати всі операції введення-виведення даних (наприклад, операції з довільною вибіркою), то і пов'язані з ними потоки теж не підтримуватимуть ці операції.

  1.  Вбудовані С++-потоки

   У мові програмування C++ міститься ряд вбудованих однобайтових (8-бітових) потоків (cin, cout, cerr і clog), які автоматично відкриваються, як тільки програма починає виконуватися. Як уже зазначалося вище, cin – це стандартний вхідний, а cout – стандартний вихідний потік. Потоки cerr і clog (вони призначені для виведення інформації про помилки) також пов'язані із стандартним виведенням даних. Різниця між ними полягає у тому, що потік clog є буферизованим, а потік cerr – ні. Це означає, що будь-які вихідні дані, послані у потік cerr, будуть негайно виведені на екран, а при використанні потоку clog дані спочатку записуються в буфер, а реальне їх виведення починається тільки тоді, коли буфер повністю заповнено.        Зазвичай потоки cerr і clog використовують для виведення інформації на екран про стан відлагодження програми або її помилки.

    У мові програмування C++ також передбачено двобайтові (16-бітові) символьні версії стандартних потоків, що іменуються wcin, wcout, wcerr і wclog. Вони призначені для підтримки таких мов як китайська, японська та інших східноазійських, для представлення яких потрібні великі символьні набори. У цьому навчальному матеріалі двобайтові стандартні потоки не розглядаються.

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

  1.  Класи потоків

    Як було зазначено вище, С++-система введення-виведення використовує заголовок <iostream>, у якому для підтримки операцій введення-виведення даних визначено достатньо складну ієрархію класів. Ця ієрархія починається з системи шаблонних класів. Шаблонний клас визначає зміст виконуваних дій, не задаючи у повному обсязі типи даних, які він повинен обробляти. Маючи шаблонний клас, можна створювати його конкретні примірники. Для бібліотеки введення-виведення стандарт мови програмування C++ створює дві спеціалізації шаблонних класів: одну для 8-, а іншу для 16-бітових ("широких") символів. Найчастіше використовуються шаблонні класи для 8-бітових символів.

    С++-система введення-виведення побудована на двох взаємопов'язаних, але різних ієрархіях шаблонних класів. Перша ієрархія виведена з класу низькорівневого введення-виведення basic_streambuf. Цей клас підтримує базові низькорівневі операції введення та виведення і забезпечує підтримку всієї С++-системи введення-виведення. Якщо Ви не плануєте займатися програмуванням спеціалізованих операцій введення-виведення даних, то Вам навряд чи доведеться використовувати безпосередньо клас basic_streambuf. Друга ієрархія класів, з якою С++-програмістам доводиться працювати безпосередньо, виведена з класу basic_ios. Це – клас високорівневого введення-виведення, який забезпечує форматування даних, контроль помилок і надає статусну інформацію, пов'язану з потоками введення-виведення. Клас basic_ios використовується як базовий для декількох похідних від нього класів, у т.ч. класів basic_istream, basic_ostream і basic_iostream. Ці класи використовуються для створення потоків, призначених для окремого введення та виведення даних і їх одночасного введення-виведення.

   Як уже зазначалося вище, бібліотека введення-виведення даних створює дві спеціалізовані ієрархії шаблонних класів: одну для 8-, а іншу для 16-бітових символів. У табл. 9.1 наведено перелік імен шаблонних класів і відповідних їм "символьних" версій.


 

А также другие работы, которые могут Вас заинтересовать

36573. Расчёт электроснабжения района 2.81 MB
  Определение расчетной нагрузки коммунально-бытовых, промышленных потребителей; выбора номинальной мощности трансформаторов; определения сечения линий как высокого, так и низкого напряжения; определения величины недоотпущенной электроэнергии; определения годовых потерь электрической энергии в линии 35 кВ
36574. Структурный тип массив. Обработка массивов 31 KB
  Такие операторы присваивания могут использоваться для копирования одного массива в другой. Однако над массивами не определены отношения. Кроме того, в Турбо Паскале нельзя использовать выражения над массивами.
36575. Структурный тип маcсив. Описание мас и доступ к эл мас 33 KB
  Идея массива состоит в том чтобы объединить в одно целое фиксированное количество элементов одного и того же типа. Общая форма описания массива имеет вид: type имя типамассива = rry [ тип индекса ] of тип элементов ; где: имя типамассива имя выбираемое программистом. тип индекса любой порядковый тип кроме longint или типдиапазон.
36576. Оператор выбора CASE OF 31 KB
  Оператор выбора является обобщением оператора ifthenelse на случай выбора одного из нескольких возможных продолжений выполнения программы. Выбор осуществляется по ключу выбора селектору. Синтаксическая структура этого оператора такова: cse ключ выбора of константа выбора 1 : оператор 1 ; .
36577. Концепция типа данных. простой тип данных 38 KB
  К любому порядковому типу применимы следующие функции: OrdX порядковый номер значения выражения Х этого типа; PredX предыдущее значение выражения Х этого типа; SuccX следующее значение выражения Х этого типа; HighX наибольшее значение диапазона аргумента Х; LowX наименьшее значение диапазона аргумента Х; Функция Ord определена для любого значения порядкового типа причём нумерация значений начинается от номера 0 номера наименьшего значения типа. Функции Pred и Succ не определены соответственно для левой и правой границы...
36578. Концепция типа данных. Тип данных в ТР 29.5 KB
  Тип данных в ТР. Ранее мы познакомились с некоторыми стандартными типами данных: числовыми символьным строковым и булевским. Стандартные типы данных это лишь частный случай общей концепции типа данных Паскаля.
36579. Оператор итерационного цикла ( repeat , while ) 31 KB
  В каждом операторе итерационного цикла будем различать условие и тело цикла повторяющееся действие. Тело цикла whiledo это один оператор записанный после do а для цикла repetuntil тело цикла может быть и последовательностью операторов записанных между repet и until. Если условие есть true выполняется тело цикла и повторно вычисляется значение условия.
36580. Композиция условий и операторов. Оператор условного перехода 32.5 KB
  Оператор условного перехода. Композиция условий и операторов. Простые операторы несмотря на свою важность недостаточны для того чтобы представлять любые алгоритмы задач.
36581. Простые операторы ввода-вывода 33.5 KB
  Эти операторы Турбо Паскаля обеспечивают простейшие формы ввода с клавиатуры и вывода на экран дисплея в текстовом режиме. К простым операторам ввода и вывода относятся операторы red redln write writeln реализующие так называемый потоковый вводвывод при котором ввод и вывод рассматриваются как непрерывный поток символов и строк протекающий через экран дисплея. На экране отображается последняя порция этого потока так что нижняя строка экрана всегда остается свободной для отображения очередной строки вывода вывод идёт в нижнюю строку...