Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Л№34.Потоковый ввод / Лекция № 32.Потоковый ввод вывод.odt
Скачиваний:
86
Добавлен:
17.04.2015
Размер:
153.09 Кб
Скачать

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>