В начале этого раздела при стыковке потока с массивом для вывода данных, этот массив и его размер передавались конструктору класса 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, позволяющим как вводить, так и выводить данные в массив.