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

}                           

//2. выходной строковый поток  как средство записи данных без форматирования       // и средство конкатенации строк

#include <strstrea.h>

void main()

{

char stroka1[ ] =”Minsk  ”;

char stroka2[ ] =”Vilnus”;

char result[60];

ostrstream (result, sizeof(result)).write(stroka1, sizeof(stroka1)); 

ostrstream (result, sizeof(result), ios::ate).write(stroka2, sizeof(stroka2)); 

cout << result<< endl;       // Minsk   Vilnus

}

//3. строковый поток  как средство «сбора» и вывода данных разных типов

#include <strstrea.h>

void main()

{

char buf[200];

ostrstream outstr(buf, sizeof(buf)); 

outstr << 123 <<’ ‘<< -456<<’ ‘<<+1.234<<’ ‘;

outstr << -0.123 <<’ ‘<<+123.456e-2<<ends;

cout << buf<< endl;       // 123 -456 1.234 -0.123 1.23456

}

Манипулятор ends действует только при выводе и обеспечивает включение в поток нулевого признака конца строки.

Двунаправленные строковые потоки

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

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

где buf – указатель на участок основной памяти (буфер потока, обычно символьный массив), параметрintlenопределяет размеры буфера в байтах, параметр intmode определяет режим обмена:

ios::in,  ios::out – определяют направление обмена;

ios::ate и ios::app – определяют размещение позиции чтения/записи в буфере;

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

//1. использование двунаправленного строкового  потока для записи и вывода данных          #include <strstrea.h>

#include <iostream.h>

#include <iomanip.h>                  //setiosflags()

const int SIZE = 80;                     //размер буфера

intmain()

   {

char ch = 'x';                   //тестовые данные

int j = 77;

double d = 67890.12345;

char str1[] = "Kafka";

char str2[] = "Freud";

char b[80];

char membuff[SIZE];              //строка-буфер

   strstream iomem (membuff, SIZE, ios::in|ios::out);  //  илиstringstream                                                                                      //создание объекта-потока для вывода                                                                                      //в строку-буфер размера SIZE

   iomem << "ch=" << ch << endl      //форматируем вывод в созданный поток

<< "j=" << j << endl       

<< setiosflags(ios::fixed) 

<< setprecision(2)         

<< "d=" << d << endl

<< "str1=" << str1 << endl

<< "str2=" << str2 << endl

<< ends;                        //завершение буфера-строки символом '\0'

cout << membuff;                   //вывод на экран содержимого буфера-строки

iomem.seekg(0L, ios::beg);     //установка потока в его  начало

iomem>> b;

cout<< b << endl;                       // ch=x

iomem >> b;

cout << b << endl;                         // j=77

iomem.getline(b, sizeof(b), '\0');  //вводится  в b остаток буфера

cout << b;                                    // вывод остатка буфера

cout << endl << endl;                         

cout << iomem.str();          //вывод всего буфера обеспечивает метод str()

return 0;

}

Результат работы программы:

ch=x

j=77

d=67890.12

str1=Kafka

str2=Freud

ch=x

j=77

d=67890.12

str1=Kafka

str2=Freud

ch=x

j=77

d=67890.12

str1=Kafka

str2=Freud

//2. использование двунаправленного строкового  потока для записи и вывода данных          #include <strstrea.h>

#include <iostream.h>

#include <iomanip.h>                  //setiosflags()

const int SIZE = 80;                     //размер буфера

intmain()

   {

char buf[SIZE*3];

char stroka1[SIZE];