Двунаправленные строковые потоки

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

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

    strstream имя_потока (char  *buf,   int  lenBuf,   int mode);

где

  • buf - указатель на участок памяти (буфер потока, обычно символьный массив), для которого создается поток;
  • lenBuf - длина в байтах участка памяти;
  • mode - индикатор режима обмена с создаваемым потоком. В качестве индикатора режима обмена используется дизъюнкция
    флагов, принадлежащих классу ios. Флаги ios::in и ios::out определяют направление обмена. Флаги ios::ate и ios::арр
    влияют на размещение указателя позиции чтения/записи в буфере и т.д.

   
В следующей программе с символьным массивом buffer[] связывается двунаправленный поток string. Затем
последовательно выполняются операции записи в поток и чтения из потока.

//OOР16_1.СРР - ввод и вывод для двунаправленного строкового потока.
#include <strstrea.h>
void main()
{
  char buffer[180];
  char stroka[150], ss[150];
  // Строковый поток string связан с массивом buffer:
  strstream string (buffer, sizeof (buffer) , ios::in | ios::out);
  string << "В строковый поток записывается " 
           "это предложение." << ends;
  // Чтение из строкового потока string в массив stroka:
  string.getline(stroka,sizeof(stroka),'\0');
  // Вывод в стандартный поток содержимого массива stroka:
  cout << "\nstroka = " << stroka;
  // Возвращение позиции чтения/записи к началу потока string:
  string.seekg(0L, ios::beg) ;
  // Чтение иа строкового потока до пробельного символа:
  string >> ss;
  cout << "\nss = " << ss;
  string >> ss;
  cout << "\nss = " << ss;
  string.getline(ss,sizeof(ss),'\0');
  cout << "\nss = " << ss;
}

Текст этой программы можно взять здесь.

   
Результат выполнения программы:

    stroka = В строковый поток записывается это предложение.
    ss = В
    ss = строковый
    ss = поток записывается это предложение.

   
Обратите внимание, что функция getline() переносит из потока string даже ведущие пробельные символы. Комментарии
в тексте программы и результаты ее выполнения достаточно подробно иллюстрируют основные особенности работы с двунаправленными потоками.
Отметим только необходимость при операциях << явно занести в поток признак конца строки (манипулятор ends),
а при повторном чтении из потока - необходимость перейти к его началу.

   
Переход к началу потока для чтения из него выполняет функция seekg(), первый параметр которой (типа long) указывает нулевую
величину смещения, а второй - положение, от которого это смещение отчитывается. В классе ios определены три возможных начала отсчета:

  • ios::beg - от начала потока (его буфера);
  • ios::end - от конца потока;
  • ios::cur - от текущей позиции чтения/записи.

   
Обратите внимание, что для двунаправленного потока класса strstream определены два указателя позиций - позиции записи и позиции чтения.
Именно поэтому в программе после окончания записи в поток string функция getline() выполняет чтение от его начала, и не
требуется перевода указателя чтения (что делает функция seekp()).

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



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

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