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

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

Создание потока вывода

Для того, чтобы состыковать поток вывода с массивом, используется конструктор ostrstream:

ostrstream ostr(char *buf, int size, int mode=ios::out);

Здесь buf служит указателем на массив, который будет использоваться для хранения символов, запи­санных в поток ostr. Размер массива передается параметром size. По умолчанию поток открыт для нормального вывода, но, используя различные режимы, объединенные с помощью побитового ИЛИ, можно задать необходимый режим. Например, можно вклю­чить ios::app для того, чтобы выводимые данные были записаны в конец той информации, которая уже содержится в массиве. Для большинства целей будет использоваться режим по умолчанию.

После открытия потока вывода в массив, все выводимые в поток данные будут помещаться в массив. Однако никаких данных не будет записано за пределы массива. Попытка выполнить та­кую запись приведет к ошибке.

Ниже представлена простая программа, иллюстрирующая поток вывода в массив:

#include <strstrea.h>
#include <iostream.h>
int main()
{
char str[80];
int a = 10;
ostrstream outs(str, sizeof (str));
outs << "Hello there ";
outs << a+44 << hex << " ";
outs.setf (ios::showbase);
outs << 100 << ends;
cout << str; // вывод строки на консоль
return 0;
}

Эта программа выводит текст «Hello there 54 0x64». Надо иметь в виду, что outs является потоком, подобно любому другому потоку, и поэтому он имеет те же возможности, что и любой из рассмотренных выше потоков. Единственная разница заключается в том, что поток состыкован с памятью. Поскольку outs является потоком, то можно использовать манипуляторы наподобие hex или ends. Функции-члены класса ostream, такие как setf(), также сохраняют свое значение.

Если необходимо, чтобы массив для хранения данных завершался нулевым символом, необходи­мо явным образом записать данный нулевой символ. В предыдущей программе манипулятор ends использовался для создания строк, оканчивающихся нулем, но можно также использовать '\0'.

Если нет полной уверенности в том, что происходит в предыдущей программе, то надо срав­нить ее со следующей программой на языке С. Эта программа в функциональном отношении эквивалентна предыдущей С++-версии. Отличие заключается в том, что в ней для вывода в массив используется функция sprinf().

#include <stdio.h>
int main()
{
char str[80];
int a = 10;
sprintf (str, "Hello there %d %#x", a+44, 100);
printf (str);
return 0;
}

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

int pcount();

Число, возвращаемое функцией pcount() также включает нулевой символ, если он существует.

Следующая программа иллюстрирует использование функции pcount(). Она сообщает, что в потоке outs содержится 17 символов — 16 букв и нулевой символ.

#include <strstrea.h>
#include <iostream.h>
int main()
{
char str[80];
ostrstream outs(str, sizeof (str));
outs << "Hello ";
outs << 34 << " " << 1234.23;
outs << ends; // завершение нулем
cout << outs.pcount (); // вывод числа символов в потоке вывода
cout << " " << str;
return 0;
}