Программирование на C и C++

Онлайн справочник программиста на C и C++

Использование динамических массивов

В начале этого раздела при стыковке потока с массивом для вывода данных, этот массив и его раз­мер передавались конструктору класса ostrstream. Такой подход работает до тех пор, пока изве­стно максимальное количество символов, которое потребуется вывести в массив. Что же делать, когда заранее неизвестно, насколько большой массив понадобится в дальнейшем? Решением этой проблемы служит вторая форма конструктора ostrtream, показанная ниже:

ostrtream();

При использовании этого конструктора ostrstream создает и поддерживает динамически выде­ляемый массив. Этот массив может расти по величине в соответствии с объемом данных, которые необходимо в нем хранить.

Для доступа к динамически выделяемому массиву следует использовать функцию str(). Она имеет следующий прототип:

char *str();

Эта функция «замораживает» массив и возвращает указатель на него. Как только массив замо­рожен, он не может снова использоваться для вывода данных. Поэтому не следует замораживать массив, пока продолжается запись в него символов.

Следующая программа использует динамический массив:

#include <strstrea.h>
#include <iostream.h>
main ()
{
char *p;
ostrstream outs; // динамическое размещение массива
outs << "I like С++ ";
outs << -10 << hex << " ";
outs.setf (ios::showbase);
outs << 100 << ends;
p = outs.str (); /* заморозка динамического буфера и возврат указателя на него */
cout << р;
delete р; // освобождение динамического буфера, созданного ostrstream()
return 0;
}

Как показывает эта программа, если заморозить массив, то придется самостоятельно освободить память при выходе из функции или программы. Однако, если массив не заморожен, память бу­дет освобождена автоматически при уничтожении потока.

Можно также использовать динамические массивы с классом strstream, позволяющим как вво­дить, так и выводить данные в массив.