Шаг 16.
Двунаправленные строковые потоки

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

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

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

    В следующей программе с символьным массивом 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 определены три возможных начала отсчета:

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

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




Предыдущий шаг Содержание Следующий шаг