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