|
Программирование >> Операторы преобразования типа
О шаблон baslc ostringstream со специализациями ostringstream и wostringstream для записи в строки ( строковый выходной поток данных -); О шаблон basic stringstream со специализациями stringstream и wstringstream для чтения и записи в строки; О шаблон basic stringbuf<> со специализациями stringbuf и wstringbuf используется другими классами строковых потоков данных для реальных чтения и записи символов. По аналогии с классами файловых потоков данных эти классы объединены в иерархию, изображенную на рис. 13.3.
baalc str*ainbuf<> streambuf / wstreambuf {virtual\ baic i stream<> istream / wiatream ba s i c str IngbufО stringbuf / wstringbuf basic ostream<> ostream / wostream basic ioatream<> iostream / wiostream baa ic is trlnga treamo istringstream/wistringstream bas i c os tr ingatreamO Qstringstream/wostringstream b a a i c s t r i ngs t r eajttO stringstream/wstringstream Рис 13.3. Иерархия классов строковых потоков данных Эти классы определяются в заголовочном файле <sstream> следующим образом: namespace std { template <class charT. class traits = char traits<charT>. class Allocator = allocator<charT> > class basicjstringstream; typedef basicjstringstream <char> istringstream; typedef basicJstringstrGam<wchar t> wlstrlngstream; template <class charT. class traits = char tra1ts<charT>. class Allocator = allocator<charT> > class bas1c ostringstream; typedef bas1c ostr1ngstream<char> ostringstream; typedef bas1c ostringstream<wchar t> wostdngstream; template <class charT. class traits * char tra1ts<charT>. class Allocator = allocator<charT> > class bas1c str1ngstream; typedef bas1c str1ngstream<char> stringstream: typedef basic str1ngstream<wchar t> wstringstream: template <class charT. class traits = char tra1ts<charT>. class Allocator = allocator<charT> > class bas1c filebuf; typedef bas1c filebuf<char> stringbuf: typedef bas1c filebuf<wchar t> wstringbuf: Главная функция в интерфейсе строковых потоков данных, str(), используется для работы с потоковым буфером (табл. 13.39). Таблица 13.39. Основные операции со строковыми потоквми данных Функция Описание str() Возвращает буфер в виде строки str(string) Присваивает string содержимое буфера Пример использования строковых потоков данных: lo/sstrl.cpp #1nclude <iostream> #1nclude <sstream> #1nclude <bitset> using namespace std; int mainO { ostringstream os; Десятичное и шестнадцатеричное значение OS dec: 15 hex hex: 15 endl; cout os.strO endl: Присоединение вещественного числа и битового поля bitset<15> b(5789); OS float: 4.67 bitset: b endl; Перезапись восьмеричным числом os.seekp(O): OS oct: Oct 15: cout os.strO endl; Результат выполнения программы выглядит так: dec: 15 hex: f oct: 17 hex: f float; 4.67 bitset: 001011010011101 Сначала в os выводятся два числа, десятичное и шестнадцатеричное. Затем к ним присоединяется вещественное число и битовое поле (в двоичном виде). Функция seekpO перемещает позицию записи в начало потока данных, поэтому при следующем вызове оператора << данные записываются в начало строки с перезаписью существующего строкового потока данных. Тем не менее символы, которые не были перезаписаны, остаются действительными. Если вы хотите полностью удалить текущее содержимое потока данных, присвойте новое содержимое буфера функцией str(): strm.strC ): Первые строки, записанные в os, завершаются манипулятором endl. Это означает, что в конце вывода производится перевод строки. Поскольку за строкой в поток данных также выводится манипулятор endl, в результате будут записаны два символа новой строки подряд. Этим объясняется наличие пустых строк в выходных данных. При работе со строковыми потоками данных программисты часто допускают распространенную ошибку - они забьгаает извлечь строку функцией strQ и вместо этого выводят объект потока данных. С точки зрения компилятора это вполне разумно и возможно, поскольку существует преобразование к void*. В результате состояние потока данных выводится в виде адреса (см. с. 571). Одним из типичных применений строковых выходных потоков данных является определение операторов вывода для пользовательских типов (см. с. 626). Строковые входные потоки данных в основном используются для форматированного чтения из существующих строк. Например, часто бывает проще читать дашше но строками зательанализирозатькаждуюетроку -отдельности. В следующем фрагменте из строки s читается целое число х, равное 3, и вещественное число f, равное 0.7: int Х; float f; std:;string s * 3.7 : std::istringstream is(s); is X f; При создании строковых потоков дайных могут задаваться флаги режима открытия файла (см. с. 606) и/нли существующие строки. С флагами ios::app
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |