Файлы. Общая концепция организации ввода-вывода данных в С++. Средства класса ios, обеспечивающие точную настройку вывода, страница 25

Входные строковые потоки

Входные строковые потоки создаются с помощью конструктора (функции-члена) класса istrstream:

istrstream  имя_потока(char *str);

где указатель str на уже существующий участок основной памяти – обязательный параметр конструктора. Например, операторы:

char buf[40];

istrstream inBuf(buf);

определят входной строковый поток с именем inBuf и свяжут его с участком памяти, предварительно выделенным для символьного массива buf[]. Теперь этот строковый поток inBuf может использоваться как левый операнд операции извлечения >>.

Примеры использования входного строкового потока

//1. строковый поток  как средство извлечения данных из строки

#include <strstrea.h>

void main()

{

char *stroka=”123.4  Minsk”;

istrstream instr(stroka);  

char ar[10];

double d;             instr>> d >> ar;

cout << ar << “  ”<< d<< endl;       // Minsk   123.4

}

//2. строковый поток  для чтения информации, передаваемой в качестве          // параметра командной строки

#include <strstrea.h>

voidmain(intargc, char *argv[])   //если при запуске программы в командной строке

// указаны параметры в виде   d:\lab6_1.exe Potokaaaaabbbbb<Enter>

{

char name [20];

istrstream in1(argv[1]);            //создаем строковый потокin1

istrstream in2(argv[2]);            //создаем строковый потокin2

in1 >> name;

cout << name<< endl;       // Potok

in2>> name;

cout << name<< endl;       // aaaaa

}

//3. использование строкового  потока  для копирования строк

#include <strstrea.h>

voidmain()  

{

char *line = ”aaaaa  bbbbb \tccccc\nddddd  eeeee\tfffff”;

istrstream in(line);            //создаем строковый поток

char stroka[50];

in.getline(stroka, sizeof(stroka), ‘\0’);  //в stroka получаем копию line

cout << stroka<< endl;       //aaaaa  bbbbb     ccccc

//ddddd eeeee     fffff

}

Напомним, что функция getline позволяет читать всю строку полностью, а не только до первого пробельного символа.

//4. использование безымянного входного строкового  потока 

#include <strstrea.h>

voidmain(intargc, char *argv[])   //если при запуске программы в командной строке

// указаны параметры в виде   d:\lab6_1.exe Potokaaaaabbbbb<Enter>

{

char name [20];

istrstream (argv[0]) >> name;   //создаем безымянный строковый поток,

//используем в качестве буфера argv[0] и сразу читаем его содержимое

cout << name<< endl;       // d:\lab6_1.exe Potok

}

Напомним, что argv[0] всегда содержит полное наименование программы с указанием диска и полного пути к каталогу, где находится EXE-файл. Для чтения последующих аргументов из командной строки используются argv[1], argv[2] и т.д.

Выходные строковые потоки

Выходные строковые потоки создаются с помощью конструктора (функции-члена) класса istrstream:

ostrstream  имя_потока(char *str, intlen, intmode);

где указатель str на уже существующий участок основной памяти (буфер), параметрintlenопределяет размеры буфера, параметр intmode определяет режим обмена.

ios::out – строковый поток создается для вывода, запись информации ведется с начала строки (устанавливается по умолчанию);

ios::ate – позиция записи устанавливается в месте размещения нулевого признака конца строки ‘\0’ (запись в продолжение);

ios::app – для строковых типов этот флаг действует аналогично флагуios::ate);

Примеры использования выходного строкового потока

//1. использование безымянного выходного строкового  потока для вывода // аргумента argv[0] командной строки

#include <strstrea.h>

voidmain(intargc, char *argv

{

char name [80];

ostrstream (name, sizeof(name)) << argv[0] << ‘\0’;  //создаем безымянный  поток                                                                                //с буфером name и выводим в него argv[0]            cout << name<< endl;                      // d:\lab6_1.exe Potok