
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()).
На следующем шаге мы рассмотрим использование строковых потоков.
Основной конструктор строковых потоков, создаваемых как для чтения, так и для записи, имеет следующий формат:
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>