Строковые потоки — это универсальные средства перевода внутренних двоичных значений в строки (выходной строковый поток) и обратно (входной строковый поток). Строковые потоки объектно-ориентированной библиотеки (см. п. 27.7 в [1]) могут быть и двунаправленными. Кроме того, при работе с ними нам нет необходимости резервировать память для строк. И наконец, со строковыми потоками можно использовать все средства форматирования или собственные написанные манипуляторы.
Чтобы использовать строковые потоки, мы должны прописать в программе оператор
#include <sstream>
После этого в программе можно в качестве объектов объявлять строковые потоки трех видов:
• входной istringstream (см. п. п. 27.7.2 в [1]);
• выходной ostringstream (см. п. п. 27.7.3 в [1]);
• двунаправленный stringstream (см. п. п. 27.7.4 в [1]).
Чтобы продемонстрировать возможности строковых потоков, напишем несколько примеров. Первый пример (листинг 14.16) демонстрирует возможности выходных строковых потоков.
Листинг 14.16. Выходной строковый поток
#include <iostream> #include <sstream>
using namespace std; продолжение J
Листинг 14.16 (продолжение) int main()
{ char s[] = "computer", с = 'L'; int i = 35; float fp = 1.7320534f; ostringstream os;
/* Форматирование и вывод данных */
os << "String: " << s << "; "
<< "Character: " << с << "; "
<< "integer: " << i << "; "
<< "Real: " << fp<< "; "
<< endl;
cout << "Output:" << '\n' « os.str() << endl;
cout << "character count = " << os.str().length() << endl;
return EXIT_SUCCESS;
}
Эта программа выводит на экран следующее: Output:
String: computer; Character: L; integer: 35; Real: 1.732053; character count = 61
Программисту нет необходимости резервировать память для формируемой строки — строковый поток все делает во внутреннем буфере. Нет также необходимости следить за позицией внутри буфера — все делает сам поток. Внутренний буфер всегда можно получить, вызвав для потока метод str ().
Выходной поток может быть создан в режиме дозаписи (как и файл). Тогда он должен быть проинициализирован существующей строкой, например:
string s = "Шестнадцатеричное чиспо = "; ostringstream os(s, ios::out|ios::арр); os << hex << 123; cout << os.strO << endl;
В результате работы этого фрагмента на экран будет выведено: Шестнадцатеричное число = 7В
Сама строка s остается без изменений. |