На этом шаге мы рассмотрим использование классов строковых потоков данных.
Для строк определены следующие потоковые классы, которые являются аналогами соответствующих классов файловых потоков данных:
- шаблон basic_istringstream со специализациями istringstream и wistringstream для чтения из строк ("строковый входной поток данных");
- шаблон baslc_ostringstream со специализациями ostringstream и wostringstream для записи в строки ("строковый выходной поток данных");
- шаблон basic_stringstream со специализациями stringstream и wstringstream для чтения и записи в строки;
- шаблон basic_stringbuf<> со специализациями stringbuf и wstringbuf используется другими классами строковых
потоков данных для реальных чтения и записи символов.
По аналогии с классами файловых потоков данных эти классы объединены в иерархию, изображенную на рисунке 1.
Рис.1. Иерархия классов строковых потоков данных
Эти классы определяются в заголовочном файле <sstream> следующим образом:
namespace std { template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_istringstream; typedef basic_istringstream <char> istringstream; typedef basic_istringstream<wchar_t> wistringstream; template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_ostringstream; typedef basic_ostringstream<char> ostringstream; typedef basic_ostringstream<wchar_t> wostringstream; template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_stringstream; typedef basic_stringstream<char> stringstream; typedef basic_stringstream<wchar_t> wstringstream; template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_filebuf; typedef basic_filebuf<char> stringbuf; typedef basic_filebuf<wchar_t> wstringbuf; }
Главная функция в интерфейсе строковых потоков данных, str(), используется для работы с потоковым буфером (таблица 1).
Таблица 1. Основные операции со строковыми потоквми данных
Функция | Описание |
---|---|
str() | Возвращает буфер в виде строки |
str(string) | Присваивает string содержимое буфера |
Пример использования строковых потоков данных:
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #include <sstream> #include <bitset> #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } int main (int argc, char* argv[]) { ostringstream os; // Десятичное и шестнадцатеричное значение os << ToRus("десятичное: ") << 15 << hex << ToRus(" шестнадцатеричное: ") << 15 << endl; cout << os.str() << endl; // Присоединение вещественного числа и битового поля bitset<15> b(5789); os << ToRus("вещественное: ") << 4.67 << ToRus(" битовое поле: ") << b << endl; // Перезапись восьмеричным числом os.seekp(0); os << ToRus("восьмеричное: ") << oct << 15; cout << os.str() << endl; getch(); return 0; } //---------------------------------------------------------------------------
Текст этого примера можно взять 471 шаг).
Одним из типичных применений строковых выходных потоков данных является определение операторов вывода для пользовательских типов.
Строковые входные потоки данных в основном используются для форматированного чтения из существующих строк. Например, часто бывает проще
читать данные по строкам и затем анализнровать каждую строку в отдельнести. В следующем фрагменте из строки s читается целое число х,
равное 3, и вещественное число f, равное 0.7:
int х; float f; std::string s = "3.7"; std::istringstream is(s); is >> x >> f;
При создании строковых потоков данных могут задаваться флаги режима открытия файла (смотри 495 шаг) и/или существующие строки. С флагами
ios::app и ios::ate символы, записанные в строковый поток данных, присоединяются к существующей строке:
std::string s; . . . . std::ostringstream os (s, ios::out | ios || app); os << 77 << std::hex << 77;
Однако строка, возвращаемая функцией str(), представляет собой копию строки s с присоединенными значениями 77 в десятичном и
шестнадцатеричном виде. Сама строка s остается неизменной.
На следующем шаге мы рассмотрим потоковые классы char*.