ТОП 10:

ІІ. Засоби мови С для роботи з потоками



Теоретичні відомості

Введення-виведення даних у С++, а також робота з файлами здійснюється з використанням потоків.

 

ІІ. Засоби мови С для роботи з потоками

1. Потоки С++

 

С++ була розроблена для класів, але сама рідко їх використовує, а якщо і використовує, то через бібліотеки. Потоки С++ як раз і виділяються тим, що реалізовані виключно через класи. Зараз використовується бібліотека класів iostream (iostream library), вперше представлена в АТ&Т С++ версії 2.0.

Потоки реалізовано окремо від функцій stdio. Тому при використанні в програмі одночасно і потоків, і stdio можуть виникнути проблеми. Якщо один символ виводиться потоковою операцією, а інший – функцією stdio putc(…), то порядок появи символів може бути порушеним через внутрішню буферизацію і автоматичне очищення буфера.

 

Потоки як узагальнені фільтри

 

Потоки складають захисну оболонку, яка надає операціям вводу-виводу поліморфні і об’єктно-орієнтовані властивості. Незважаючи на те, що потоки часто асоціюються саме з вводом-виводом, реально вони є абстракцією передачі даних від одного об”єкта до іншого за допомогою механізму буферизації. Це означає, що бідь-яка функція, що використовується для передачі даних з одного місця в пам’яті в інше (зі зміною даних або без), може розглядатися як потокова операція. Наприклад, старі функції ANSI С memmove(...), sprintf(...), strcpy(...) можна реалізувати як потокові операції, оскільки вони представляють собою передачу даних в пам’яті: дані переходять так, як би це був потік.

В бібліотеці потоків є багато класів, які можна розділити на три категорії (табл. 1). Там же приведено список тих стаих функцій ANSI, які вони заміняють.

 

Таблиця 1. Нові категорії потоку і приклади функцій ANSI, які вони замінюють.

Категорія потоку Приклади функцій ANSI, які їх замінюють
Стандартний ввід-вивід scanf(...), printf(...)
Ввід-вивід файлів fopen(...), fread(...), fclose(...)
Форматування в пам’яті Sscanf(...),sprintf(...)

 

Стандартний потоковий ввід-вивід з вбудованими типами даних

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

 

потік_вводу >> типізована_зміна;

потік_виводу << типізована_зміна;

 

Об’єкт потоку завжди міститься в лівій частині виразу. Оператори >> і << вказують на напрям потоку даних від одного об’єкта до іншого. З потоком вводу-виводу можна використовувати будь-який вбудований тип даних. Класи користувача, якщо вони були розроблені для підтримки вводу-виводу, також сумісні з потоком. Всі випадки в прикладі 1 допустимі.

 

Введення-виведення типів int i long

Читати і записувати дані типів int i long дуже просто, оскільки всю роботу роблять вбудовані механізми вставки і вилучення символів. Коли з потоку вилучаються int i long, система автоматично очищує ввід від служебних символів.

Можна управляти вводом і виводом чисел, змінивши наступні атрибути:

систему числення (десяткова, вісімкова, шістнадцяткова)

ширину поля

вирівнювання

заповнення поля

наявність знака +

використання великих букв (для шістнадцяткових чисел)

Атрибути змінюються спеціальними маніпуляторами потоку. При виводі по замовчуванню друкуються лише значущі цифри числа без заповнення всіх позицій поля. Під час вводу будь-який символ, що не є цифрою, знаком + (плюс) або – (мінус), припиняє операцію вилучення. Значення, яке повертається, є числом, що складається з символів, зчитаних до завершення операції.

 

Введення-виведення типів float i double

Типи float i double читати і записувати так само легко, як int i long. При вилученні чисел з потоку спочатку пропускаються всі символи пропуску. Вилучення припиняється на першому символі, не допустимому в числі з плаваючою крапкою. Вбудовані механізми вставки і вилучення забезпечують таку поведінку по замовчуванню.

Формат, який використовується для відображення float i double, легко змінити за допомогою маніпуляторів. Зокрема, можна керувати наступними атрибутами:

кількість десяткових цифр

використання наукового запису

друк знака +

заповнення

ширина поля

вирівнювання

Читання float, double і long double припиняється виявленні недопустимого для числа символу. Недопустимі символи з потоку не вилучаються.

 

Введення-виведення класів користувача

Потоки елегантно працюють не лише з вбудованими типами даних С++, але і з класами користувача. Все, що потрібно зробити, так це перегрузити оператори вставки в потік і вилучення з потоку. Відповідний приклад 3 з використанням класу Point приведено нище.

 

Маніпулятори

З появою бібліотеки вводу-виводу ANSI C форматування даних стало більш гнучким. За допомогою функцій printf(...) i sprintf(...) стали доступними як форматований вивід в файл, так і форматування даних в пам’яті. І навпаки, форматовані дані можна зчитати в змінні за допомогою функцій scanf(...) i sscanf(...).

Для роботи з будь-яким вбудованим маніпулятором використовується стандартний заголовочний файл iomanip.h. більшість маніпуляторів впливають на потік в наступних операціях з потоком. Це означає, що будь-які зміни в форматуванні потоку зберігаються до тих пір, поки не будуть внесені нові зміни. Нижче приведено список всіх вбудованих маніпуляторів.

 

dec Встановлює десяткову систему числення.

Впливає на int і long. Потоки використовують основу 10 за замовчуванням

 

hex Встановлює шістнадцяткову систему числення

 

oct Встановлює вісімкову систему числення

 

ws Вибирає з потоку вводу символи пропуску.

Потік буде читатися до появи символу, який

відрізняється від пропуску, або до виникнення

помилки потоку

 

endl Вставляє в потік виводу символ нової стрічки і

потім очищає потік

 

ends Вставляє ‘\0’ в потік виводу

 

flush Очищає потік виводу

 

setbase(int) Встановлює основу числення до будь-якого з

чотирьох значень:

0: Основа по замовчуванню. При виводі

використовується десяткова основа, при вводі –

числа, що починаються з ‘0’, вважаються

вісімковими, числа, що починаються з ‘0x’, –

шістнадцятковими. У всіх інших випадках

основа вважається десятковим.

8: Для вводу-виводу використовується

основа 8

10: Для вводу-виводу – 10

16: Для вводу-виводу – 16

Інші значення ігноруються. Бібліотека iostream

не підтримує довільних основ, подібних 3, 12 і

т.д. Якщо потрібно представити значення за

основою, яка відрізняється від 8, 10 або 16, то

відповідне перетворення потрібно виконати

явно

 

resetiosflags(long) Очищає один або більше флагів

форматування в ios::x_flags

 

setiosflags(long) Встановлює дин або більше флагів

форматування в ios::x_flags

 

setfill(int) Встановлює символ-зповнювач. Символ-

заповнювач використовується для заповнення

поля тоді, коли ширина поля більша за ширину

виведеного значення. Заповнення не буде, якщо

користувач не вказав мінімальної ширини поля

за допомогою маніпулятора setw(int) або

функції ios::width(int). По замовчуванню

символом-заповнювачем є пробіл. Заповнення

буде проходити справа, зліва або якось іще, в

залежності від значення бітів

ios::adjustfield, встановлених

звертанням до ios::setf(long)

 

setprecision(int) Встановлює число цифр після десяткової

крапки в числах з плаваючою крапкою. Цей

маніпулятор діє лише на потоки виводу

 

setw(int width) Встановлює ширину наступної змінної, яка

вставляється в потік. Якщо значення наступної

змінної потребує для запису менше місця, ніж

вказано, то буде здійснюватися заповнення

символом-заповнювачем, встановленим

маніпулятором setfill(int)

 

Використання текстових файлів для введення

Текстовий файл – це послідовність ASCII-символів, розділена на стрічки. Кожна попередня стрічка закінчується символом переходу на нову стрічку. Класи файлових потоків оснащений функціями для відкриття і закриття файлів, читання і запису стрічок тексту і виконання багатьох інших дій. В прикладі 4 показано, як відкрити файл, перевірити на помилки і вивести його вміст на дисплей.

 

Виведення текстових файлів

Записувати файли майже так само легко, як і читати. Виникає невелика складність при відкритті файлу в режимі виводу, коли потрібно точно знати, як буде записуватися файл. По замовчуванню існуючий файл (в момент відкриття) врізається до нуля, але таку поведінку можна змінити. В прикладі 5 відкривається файл README.TXT, і його перші чотири стрічки копіюються в новий файл COPY.

 

Читання бінарних файлів

Дані в бінарних файлах не мають ніяких роздільників і спеціальних символів. Це також стосується символу ‘\0’. Таким чином, стрічки в бінарному файлі не закінчуються нульовим символом. Фактично самі стрічки в бінарному фалі не мають ніякого смислу. Бінарні файли потрібно обробляти не так, як текстові: в них немає службових символів, їх дані не організовані в стрічки з позначенням кінця кожної стрічки і серед даних можуть бути будь-які восьмибітові значення. Тим не менше, робота з бінарними файлами досить проста. Відкриття і закриття їх здійснюється точно так само, як і текстових файлів, за виключенням того, що в функцію відкриття передається флаг ios::binary. Цілком можливе відкриття текстового файлу в бінарному режимі. Нижче приведено відповідний приклад 6.

 

Запис у бінарні файли

Для запису бінарних даних в файл існує два основних методи: посимвольний запис і запис блоками. Для першого методу використовується функція put(char), для другого – функція write(char*, int). В прикладі 7 продемонстрована робота обох функцій.

 

Приклад 7. Запис двійкових даних в файл за допомогою двох методів


#include <iostream.h>

#include <fstream.h>

 

class Data {

char name[10];

char surname[20];

int age;

float salary;

 

public:

Data() {age=0;}

int Age() {return age;}

~Data() {}

};

 

void main()

{

//відкриття існуючого файлу

ofstream company_records(“RECORDS.DAT”,

ios::binary);

 

//перевірка на помилки відкриття

if(!company_records)

{

cout << “\nCouldn’t open file RECORDS.DAT”;

return;

}

 

Data employee;

 

int number=0;

while(number < 10 && company_records)

{

company_records.put((char)number++);

company_records.write((char*)&employee,

sizeof(employee));

}

}


Програма записує 10 записів про службовців з об’єкту класу в двійковий файл. Як і завжди, потік слід перевірити на помилки читання або запису. Використання функції write(...) з класами, що мають віртуальні функції або інші складні конструкції, деколи призводить до запису даних, які потім неможливо правильно прочитати за допомогою функції read(...). якщо є сумніви, при записі складних даних краще працювати зі структурами, ніж з класами.

Бінарні файли, в порівнянні з текстовими, складніше використовувати. Це результат неструктурованої природи даних. Коли в файл поміщується бінарний об’єкт, компілятору потрібно точно вказати, яка довжина об’єкту, оскільки в двійковому файлі немає роздільників стрічок, що вказують на довжину. Те ж саме можна сказати і про вилучення даних.

 

Копіювання файлів

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

 

#include <fstream.h>

 

void f()

{

ifstream input(“c:\\t.bat”);

ofstream output(“c:\\u.bat”);

char c;

while(input.get(c))

output.put(c);

}

 

 

Текстові і двійкові потоки

Текстові потоки використовуються для звичайних текстових файлів DOS, таких як файл, створений редактором Borland C. Потік вводу-виводу С припускає, що текстовий файл розділений на рядки, відділені за допомогою одного символу нового рядка (LF), який є ASCII символ переведення рядка. Текстовий файл DOS, проте, записується на диск із двома символами між кожній рядком - ASCII символами повернення каретки (CR) і перевід рядка (LF). У текстовому режимі Borland C перетворить пару повернення каретки/переведення рядка (CR/LF) в один символ переведення рядка (LF) при вводі; переведення рядка (LF) перетвориться в пару CR/LF при виводі.

Двійковий потік значно простіший, ніж текстовий. Ніяких перетворень не проводиться. Будь-які символи читаються і записуються без змін. Файл сприймається як суцільна послідодовність байтів.

Файл може бути оголошений і в текстовому, і у двійковому режимі без будь-яких проблем, якщо ви поінформовані і розумієте перетворення, що відбуваються в текстовому потоці. Borland C не "запам'ятовує", як файл був створений або модифікований.

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

 

Буферизація потоків

Потоки, зв'язані з файлами, звичайно буферизують. Це дозволяє дуже швидко вводити або виводити одиночні символи так, як це роблять getc і putc. Ви можете створити ваш власний буфер, змінити розмір використовуваного буфера, або змусити потік не використовувати буфер за допомогою виклику setvbuf або setbuf. Буфери потоків, що створюються користувачем, дуже корисні для перевірки вводу і виводу до того, як виникнуть певні системні помилки.

Буфер автоматично очищується при його заповненні, при створенні потоку і при нормальному завершенні програми. Ви можете використовувати fflush і flushall для очищення буфера.

При використанні функції setbuf() розмір буфера визначається системною константою BUFSIZ, що визначена в файлі stdio.h. Синтаксис функції виглядає наступним чином:

void setbuf( FILE *stream, char *buffer );

 

Розглянемо наступний приклад

 

#include<stdio.h>

char myBuf[50];

main(){

setbuf(stdout, myBuf); //спробуйте закоментувати

fputs("In stdout\n", stdout);

fputs("In stderr\n", stderr);

fputs("In stdout again\n", stdout);

fflush(stdout);

return(0);

}

 

В даному випадку програма зв’язує буфер myBuf з stdout, вивід в stdout відбувається тільки після виконання fflush(stdout). Якщо закоментувати оператор setbuf(), програма виводить повідомлення кожного оператора fputs() одразу після його виконання.

Використовуючи функцію setvbuf(), ми задаємо розмір буфера явно, а не за допомогою константи BUFSIZ. Синтаксис функції:

int setvbuf( FILE *stream, char *buffer, int mode, size_t size );

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

Звичайно, ви використовуєте потоки для читання і запису даних послідовно. Ввід-вивід здійснюється в поточній позиції файла. Коли ви записуєте або зчитуєте дані, програма переміщає файлову позицію безпосередньо за обробленими даними.

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

Якщо ви одночасно записуєте і зчитуєте дані з потоку, то ви не можете вільно змішувати оператори читання і запису. Ви повинні очистити буфер потоку між записом і читанням. Виклик fflush, flushall або fseek очищає буфер і дозволяє вам перемінити операції. Для максимальної переносимости ви повинні очищати буфер, навіть якщо він не використовується, тому що інші системи можуть мати додаткові обмеження на змішування операцій вводу-виводу навіть без буфера.

 

Стандартні потоки

На додаток до потоків, що створюються викликом fopen, п'ять визначених потоків доступні при кожному запуску програми

 

Ім'я Ввід/вивід Режим Потік
stdin ввід Текстовий Стандартний ввід
stdout вивід Текстовий Стандартний вивід
stderr вивід Текстовий Стандартна помилка
stdaux ввід-вивід Двійковий допоміжний ввід-вивід
stdprn вивід Двійковий Принтерний вивід

 

Потоки stdaux і stdprn специфичні для DOS і не використовуються в інших системах.

Потоки stdin і stdout можуть бути перенаправлені DOS, у той час як інші пов'язані з особливими пристроями: stderr - із консоллю (CON:), stdprn - із принтером (PRN:), а stdaux - із допоміжним портом.

Допоміжний порт залежить від конфігурації вашої машини; звичайно це COM1:. Подивитеся в документації вашої DOS про перенаправленні вводу і виводу в командному рядку DOS. Без перенаправлення потоки stdin і stdout пов'язані з консоллю (CON:). Крім того, якщо немає перенаправления, stdin має рядок буфера, а stdout не буферизирується. Інші визначені потоки теж не буферизируються.

Для установки визначеного потоку в режим відмінний від режиму за замовчуванням (наприклад, для установки stdprn у текстовий режим) використовуйте setmode. Ім'я визначеного потоку є константою і ви не можете присвоювати йому значення. Якщо ви хочете зв'язати один із цих потоків із файлом або пристроєм, то використовуйте freopen.

 

Завдання

Створити файл (базу даних) що містив би записи у такому форматі:

— перший запис — число типу long, що означає загальну кількість записів у файлі;

— після нього йдуть описані нижче записи (за варіантами).

Відповідно перший запис від початку файлу має зміщення 4 байти, наступний — 4+<розмір запису> байт і т. д. Забезпечити зручний інтерфейс для введення даних і передбачити наступні функції (за варіантами):

Структура полів бази даних успішності студента (завдання 1 — 10):

Прізвище, ім’я, по-батькові студента; char [60]

Дата народження date

Стать (ч/ж) char [1]

Група char [10]

Середній бал float

Варіанти завдань для наведеної структури бази даних:

1. Сортування записів по успішності студентів. Видалення записів з успішністю менше заданої.

2. Пошук студента по полю П.І.Б. без врахування регістру. У випадку якщо не знайдено такого студента вивести його найближчий відповідник. Наприклад: користувач вводить: “Петр” і отримує дані на студента “Петров І.В.”.

3. Підрахунок кількості студентів які отримуватимуть стипендію (середній бал вище заданого) і сортування їх по групам. Наприклад: БМ‑21: 5 чол; ПК‑11: 8 чол. і т. д.

4. Зручний інтерфейс для редагування бази даних: додавання, вилучення і редагування вже існуючих записів.

5. Фільтрування бази даних по полю “Група” і сортування результатів по полю “П.І.Б.”. Тобто: користувач вводить: “ЕС‑31” і отримує список всіх студентів групи ЕС‑31, впорядкований по прізвищу студентів.

6. Виведення П.І.Б. а також дати народження всіх студентів жіночої статі молодших вказаного віку. Тобто користувач вводить вік студента, наприклад 19 і отримує список студенток молодших 19 років з датами їх народження.

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

8. Виведення списку наймолодших студентів чоловічої статі у кожній групі. Тобто: наймолодший студент групи БМ‑42 Іванов Б. П., вік 20 років; і т. д.

9. Сортування записів у базі даних на диску по групам. Тобто спочатку повинні йти студенти однієї групи, потім іншої і т. д.

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

Структура полів бази даних книжок в бібліотеці (завдання 11 — 20):

Автор (автори) книги char [120]

Назва книги char [240]

Рік видання unsigned int

Місто і видавництво у форматі: [Назва міста: Назва видавництва] char [80]

Кількість сторінок unsigned int

Кількість примірників unsigned int

Варіанти завдань для наведеної структури бази даних:

11. Сортування записів по року видавництва: від найстаріших до найновіших. Видалення записів, виданих раніше вказаного року.

12. Пошук книжок, поле “Автор” яких містить введене прізвище автора без врахування регістру, тобто: користувач вводить “Іванов” і отримує список книжок з авторами: “Петров А. М. Іванов Б. В.”, “ІВАНОВ М. П.” і т. д.

13. Кожен рік книжки, вік яких кратний N років повинні проходити повторну інвентаризацію і перевірку (чи наявні у книжці всі сторінки і т. п.) Вивести відносно вказаного N і року список книжок, що підлягають перевірці. Забезпечити можливість редагування поля “кількість примірників” і видалення із бази даних тих книжок, кількість примірників яких рівна нулю.

14. Зручний інтерфейс для редагування бази даних: додавання, вилучення і редагування вже існуючих записів. Можливість збільшувати (зменшувати) кількість примірників якоїсь книжки у випадку надходження нових (або зношення і списання старих).

15. Фільтрування книжок по полю “Місто і видавництво” без врахування видавництва і сортування результатів по полю “Автори”. Себто, користувач вводить: “Київ” і отримує відсортований по полю “Автори” список всіх книжок, виданих у Києві.

16. Користувач вводить місто, у якому видана книга і отримує такі дані: список всіх видавництв цього міста, книги яких є в каталозі. По кожному елементу списку слід вивести кількість різних книжок (не кількість примірників) цього видавництва, що є в бібліотеці. При виборі якогось видавництва користувачем слід вивести список всіх книжок цього видавництва.

17. Пошук книг назва яких містить введену стрічку (без врахування регістру). Наприклад: користувач вводить “економ” і отримує список книжок “Економіка”, “Основи економічної теорії”, “Підприємство. Основи економічного добробуту” і т. д.

18. Сортування книжок по кількості примірників. Від найменшого до найбільшого. Виділити червоним кольором у списку книжки з нульовою кількістю примірників і синім — з кількістю примірників, менше заданої. Запропонувати видалити всі книжки з нульовою кількістю примірників. Забезпечити можливість виведення тільки книжок з нульовою кількістю примірників, тільки книжок з кількістю примірників менше заданої або тільки книжок з нормальною (більшою або рівною заданій) кількістю примірників.

19. Сортування книжок по полю місто і видавництво по алфавіту. Наприклад спочатку всі книжки “Київ: Веселка”, потім “Київ: Політвидав”, а потім “Тернопіль: Збруч” і т. д.

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

Структура полів бази даних підприємств Тернопільської області (завдання 21 — 30):

Назва підприємства char [100]

Прізвище, ім’я, по-батькові власника char [80]

Форма власності char [50]

Рік заснування unsigned int

Кількість працюючих unsigned int

Валовий чистий прибуток float

Варіанти завдань для наведеної структури бази даних:

21. Сортування підприємств по року заснування по зростанню. Видалення підприємств, заснованих раніше вказаного року.

22. Сортування підприємств за формою власності. Виведення списку підприємств, форма власності яких відповідає формі власності, заданій користувачем.

23. Пошук підприємств, у назві яких міститься стрічка, введена користувачем без врахування регістру. Наприклад: користувач вводить “Ват” і отримує: “Ватра”, “ВАТ “Тернопільський хлібозавод № 2”” і т. д.

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

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

26. Видалити з бази даних нерентабельні підприємства (Валовий чистий прибуток яких менший нуля). Вивести список всіх підприємств, що залишилися у порядку зростання їхнього прибутку. Червоним кольором виділити підприємства з нульовим прибутком.

27. Забезпечити зручний інтерфейс для редагування бази даних: додавання нових записів, видалення і редагування вже існуючих.

28. Знайти в базі даних однакові записи. Видалити зайві і вивести список підприємств, які були записані в базі даних більше одного разу. Підрахувати їх (підприємств) кількість а також кількість видалених записів.

29. Підрахувати середню кількість працюючих на підприємстві. Для кожного підприємства підрахувати середню заробітну плату (прибуток/кількість працюючих). Підрахувати середню заробітну плату. Вивести список підприємств, заробітна плата на яких менша середньої, а кількість працюючих більша середньої.

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

Теоретичні відомості

Введення-виведення даних у С++, а також робота з файлами здійснюється з використанням потоків.

 

ІІ. Засоби мови С для роботи з потоками

1. Потоки С++

 

С++ була розроблена для класів, але сама рідко їх використовує, а якщо і використовує, то через бібліотеки. Потоки С++ як раз і виділяються тим, що реалізовані виключно через класи. Зараз використовується бібліотека класів iostream (iostream library), вперше представлена в АТ&Т С++ версії 2.0.

Потоки реалізовано окремо від функцій stdio. Тому при використанні в програмі одночасно і потоків, і stdio можуть виникнути проблеми. Якщо один символ виводиться потоковою операцією, а інший – функцією stdio putc(…), то порядок появи символів може бути порушеним через внутрішню буферизацію і автоматичне очищення буфера.

 







Последнее изменение этой страницы: 2016-04-26; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.204.191.0 (0.037 с.)