Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

12.10 Форматування в пам’яті

Бібліотека потоків С++ передбачає операції ввода-вивода над даними в пам’яті (резидентними потоками), що реалізовані в класах istrstream та ostrstream. Клас istrstream забезпечує iнтерфейс для форматого читання з пам'ятi, ostrstream - запису в пам'ять, strstream підтримує обидва типи операцій.

Приклад:

char info[ ]="вiдмiнникiв 5";

"двiйочникiв 2";

istrstream stat(info);

char name[20];

int mark;

for(int i=0; i<2; i++)

{stat >>name;

stat >>mark;

cout <<"в ПМ 21"

<<name

<<mark

<<endl;

}

Клас ostrstream надає інтерфейс для форматованого виводу в пам’ять. В класі є конструктор по замовчуванню, який виділяє буфер та динамічно змінює його розмір під час виконання. Також є конструктор, який дозволяє задавати буфер та його розмір. Розглянемо приклад:

#include<strstream.h>

int main(void)

{

//створюється потік з динамічним буфером

ostrstream osstr_a;

char buffer[100];

//створюється потік з заданим буфером

ostrstream osstr_b(buffer, sizeof(buffer));

//...

return 0;

}

Крім конструкторів та деструктора ostrstream має такі методи:

char*ostrstream::str()- повертає вказівник на буфер ostrstream. Крім того, він “заморожує ” масив, робить динамічний буфер власністю користувача. Після виклику str() необхідно знищити буфер або передати його у власність потока ostrstream так:

oss.rdbuf()->freeze(0);

int ostrstream::pcount()-повертає кількість байт, записаних в буфер.

Розглянемо приклад:

#include<strstream.h>

int main(void)

{

ostrstream oss;

iny i=10;

char *str=“значення рівне”;

oss<<str<<i<<endl;

//вивести результат форматування

cout<<oss.str();

//повернути буфер для очистки у власність oss

oss.rdbuf()->freeze();

return 0;

}

Відмітимо, що при роботі з об’єктами ostrstream необхідно в явному вигляді добавити до потоку нуль-символ. В противному випадку метод str() поверне вказівник на рядок, не обмежений нуль-символом.

Можна створити потiк ostrstream в режимi доповнення, встановивши бiт в ios::ate або ios::app в опціональному третьому параметрі конструктора.Це дозволить передати в якості буфера обмежений нулем рядок і поміщення в буфер почнуться з позиціії нульового символа. Такий режим можна використати для конкатенації рядків. Приклад:

char msg[100]=“Час=”;

ostrstream oss(msg,sizeof(msg),ios::out|ios::app);

char time=“11:20:34”;

oss<<time;

cout<<oss.str();

oss.rdbuf()->freeze();

Контрольні запитання

1. Як організована система вводу-виводу С++?

2. Чому для перегрузки запису в потік та зчитування використані операції зсуву ?

3. Що забезпечує “зчіплений” виклик операторів вводу-виводу ?

4. Як здійснюється переадресація вводу-виводу для типів даних користувача ?

5. Як регулюється ширина поля потоку при форматованому виводі?

6. Для чого використовується precision()?

6. Як працювати з прапорцями форматування ?

7. Які функції та типи маніпуляторів?

8. Як аналізувати стан потоку та керувати ним ?

9. Які дії можуть виконувати конструктори файлових потоків?

10. Як відкрити файл в текстовому та бінарному режимі?

11. Які основні функції роботи з файлами ?

12. Чому можна порівнювати об’єкти з нулем ?

13. Для чого служить метод str() та freeze()?

14. Що буде у випадку, коли в потоці при виклиці str() немає нуль-символа?

15. Чи відрізняються кількості символів, прочитаних в текстовому та бінарному режимах в прикладі п. 17.8.3

Завдання 12:

1. Переадресовуючи стандартний ввід-вивід, написати програму копіювання вмісу деякого текстового файлу у інший файл.

2. Описати клас complex та перегрузити оператори виводу в потік та вводу, визначивши їх як

а) члени класу

б) дружні

3. Написати програму, в якій

а) відкривається файл та прикріплюється до об’єкта;

б) конструюється об’єкт та прикріплюється до вже відкритого файла;

в) відкривається файл за допомогою метода open().

Продемонструвати різні режими доступу

4. Описавши клас myfile, полем якого виступає змінна типу *FILE, визначити ряд власних функцій роботи з файлом (відкриття в текстовому та бінарному режимах, запису та зчитування інформації, закриття), використовуючи відповідні бібліотечні функції С++. Для відкриття файлу використовувати конструктори файлових потоків.

5. Дописати на початок деякого виконуваного файлу інший ехе-файл, який виконується замість вихідного.

6. Написати функцію, яка, відкриваючи файл, що є С++-програмою,

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

б) знищує всі коментарі;

в) перевіряє відповідність відкриваючих та закриваючих дужок;

г) використовуючи набір певних директив define, кодує окремі

фрагменти програми (з підключенням відповідного файлу директив препроцессору щоб зберігалась правильність програми);

д) дописує на початок програми фрагмент коду, який видає певне повідомлення та перериває роботу програми на деякий час;

7. Вивести число

а) з заданою шириною поля

б) з заданою точністю

в) з заданим заповнюючим символом

г) з вказаною основою

д) з вказаною нотацією

е) з вирівнюванням по лівому(правому) краю поля

є) з вказанням знаку числа

Використати прапорці форматування та методи роботи з ними.

8. Виконати попередню вправу з використанням маніпуляторів.

9. Визначити екземпляр класу ostrstream з динамічним буфером. Записати в буфер різнотопні дані та вивести результат форматування за допомогою метода str(). Повернути буфер для очистки у власність об’єкта за допомогою метода freeze().

Перевірити, що знаходиться в буфері після виклику цього методу. Чи можна ще дописувати якісь дані в буфер після виклику freeze()?