Ввод-вывод с использованием потоковых классов. Классы строковых потоков данных

   
На этом шаге мы рассмотрим использование классов строковых потоков данных.

   
Для строк определены следующие потоковые классы, которые являются аналогами соответствующих классов файловых потоков данных:

  • шаблон 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*.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий