Здавалка
Главная | Обратная связь

Базові потоки вводу-виводу



Для введення з потоку використовуються об'єкти класу istream. Для виводу в потік - об'єкти класу ostream.

У класі istream визначені наступні функції.

· istream& get (char* buffer, int size, char delimiter='\n');

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

· istream& read(char* buffer,int size);

Не підтримує роздільників, і зчитані в буфер символи не завершуються нульовим символом. Кількість зчитаних символів запам'ятовується в istream::gcount_ (private).

· istream& getline(char* buffer,int size, char delimiter='\n');

Роздільник витягається з потоку, але в буфер не заноситься. Це основна функція для витягу рядків з потоку. Зчитані символи завершуються нульовим символом.

· istream& get(streambuf& s,char delimiter='\n');

Копіює дані з istream у streambuf доти, поки не знайде кінець файлу чи символ-роздільник. Останній не витягається з istream. У s нульовий символ не записується.

· istream get (char& C);

Читає символ з istream у С. У випадку помилки, С приймає значення 0XFF.

· int get();

Витягає з istream черговий символ. При виявленні кінця файлу повертає EOF.

· int peek();

Повертає черговий символ з istream, не витягаючи його з istream.

· int gcount();

Повертає кількість символів, зчитаних під час останньої операції неформатованого вводу.

* istream& putback(З)

Якщо в області get об'єкта streambuf є вільний простір, то туди міститься символ С.

* istream& ignore(int count=1,int target=EOF);

Витягає символ з istream, поки не відбудеться наступне:

- функція не витягне count символів;

- не буде виявлений символ target;

- не буде досягнуто кінця файлу.

У класі ostream визначені наступні функції.

* ostream& put(char C);

Поміщає в ostream символ С.

* ostream& write(const char* buffer,int size);

Записує в ostream вміст буфера. Символи копіюються доти, поки не виникне помилка чи не буде скопійовано size символів. Буфер записується без форматування. Обробка нульових символів нічим не відрізняється від обробки інших. Дана функція здійснює передачу неопрацьованих даних (бінарних чи текстових) у ostream.

* ostream& flush();

Скидає буфер streambuf.

Для прямого доступу використовуються наступні функції установки позиції читання - запису.

При читанні

* istream& seekg(long p);

Встановлює покажчик потоку get (не плутати з функцією) зі зсувом р від початку потоку.

* istream& seekg(long p,seek_dir point);

Вказується початкова точка переміщення

* enum seek_dir{beg,curr,end}

Позитивне значення р переміщає покажчик get вперед (до кінця потоку), негативне значення р – назад (до початку потоку).

* long tellg();

Повертає поточне положення покажчика get.

При записі

*ostream& seekp(long p);

Переміщає покажчик put у streambuf на позицію р від початку буфера streambuf.

* ostream& seekp(long p,seek_dir point);

Вказується точка відліку.

* long tellp();

Повертає поточне положення покажчика put.

Крім цих функцій у класі istream перевантажена операція >>, а в класі ostream <<. Операції << і >> мають два операнда Лівим операндом є об'єкт класу istream (ostream), а правим – дане, тип якого заданий у мові.

Для того щоб використовувати операції << і >> для всіх стандартних типів даних використовується відповідне число перевантажених функцій operator<< і operator>>. При виконанні операцій вводу-виводу в залежності від типу правого операнда викликається та чи інша перевантажена функція operator.

Підтримуються наступні типи даних: цілого, речовинні, рядка (char*). Для висновку – void* (усі покажчики, відмінні від char*, автоматично переводяться до void*). Перевантаження операції >> і << не змінюють їх пріоритету.

Функції operator<< і operator>>повертають посилання на той потоковий об'єкт, що зазначений ліворуч від знака операції. Таким чином, можна формувати “ланцюжок ” операцій.

cout << a << b << c;

cin >> i >> j >> k;

При вводі-виводі можна виконувати форматування даних.

Щоб використовувати операції >> і << з даними типів користувачів, обумовлених користувачем, необхідно розширити дія цих операцій, ввівши нові операції-функції. Першим параметром операції-функції повинна бути посилання на об'єкт потокового типу, другим – посилання на об'єкт типу користувача.

У файлі iostream.h визначені наступні об'єкти, зв'язані зі стандартними потоками вводу-виводу.

cin – об'єкт класу istream, зв'язаний зі стандартним буферизованим вхідним потоком.

cout – об'єкт класу ostream, зв'язаний зі стандартним буферизованим вихідним потоком.

cerr – не буферизований вихідний потік для повідомлення про помилки.

clog – буферизований вихідний потік для повідомлення про помилки.

Форматування

Безпосереднє застосування операцій вводу << і виводу >> до стандартних потоків cout, cin, cerr, clog для даних базових типів приводить до використання форматів зовнішнього представлення, що “замовчуються”, значень, що пересилаються.

Формати представлення виведеної інформації і правила сприйняття даних при вводі можуть бути змінені програмістом за допомогою прапорів форматування. Ці прапори успадковані всіма потоками з базового класу ios. Прапори форматування реалізовані у виді окремих фіксованих бітів і зберігаються в protected компоненті класу long x_flags. Для доступу до них наявні відповідні public функції.

Крім прапорів форматування використовуються наступні protected компонентні дані класу ios.

int x_width – мінімальна ширина поля виводу.

int x_precision – точність представлення дійсних чисел (кількість цифр дробової частини) при виводі.

int x_fill – символ заповнювач при виводі, за замовчуванням – пробіл.

Для одержання (встановлення) значень цих полів використовуються наступні компонентні функції

int width();

int width(int);

int precision();

int precision(int);

char fill();

char fill(char);

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

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

Маніпуляторами називаються спеціальні функції, що дозволяють модифікувати роботу потоку. Особливість маніпуляторів полягає в тому, що їх можна використовувати в якості правого операнда операції >> чи <<. У якості лівого операнда, як звичайно, використовується потік (посилання на потік), і саме на цей потік впливає маніпулятор.

Для забезпечення роботи з маніпуляторами в класах istream і ostream є наступні перевантажені функції operator.

istream& operator>>(istream&(*_f)( istream&));

ostream& operator<<(ostream&(*_f)(ostream&));

При використанні маніпуляторів варто включити заголовний файл <iomanip.h>, у якому визначені вбудовані маніпулятори.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.