Шаг 17.
Использование строковых потоков

    На этом шаге мы разберем примеры использования строковых потоков.

    Строковые потоки можно использовать по-разному. С их помощью в участок памяти, связанный со строковым потоком, можно заносить разнотипную информацию, затем извлекать ее по нужным правилам. Строковый поток можно в этом случае сделать внешним и с его помощью осуществлять межмодульный обмен. В следующей программе с помощью дуального (двунаправленного) строкового потока выполняется обмен между функциями. Строковый поток с именем obmen и связанный с ним символьный массив Link[] определены как глобальные и тем самым доступны во всех функциях файла с программой. В основной программе в строковый поток obmen заносятся данные из массива структур. Предварительно в поток записывается значение количества элементов массива. В функции result() выполняется чтение из строкового потока. При первом обращении к потоку "извлекается" значение количества элементов, используемое затем для организации цикла чтения структур. Структурный тип с именем element и две операции-функции для перегрузки операций обмена >> и << со строковыми потоками определены до функции main(). Текст программы:

//OOР17_1.СРР  -  перегрузка операций обмена   (<<,  >>)   и
//  двунаправленный строковый поток ввода-вывода.
#include  <strstrea.h>
const int lenLink = 200;  // Глобальная константа.
char Link[lenLink];       // Глобальный символьный массив.
// Строковый поток obmen связан с массивом Link:
strstream obmen (Link,sizeof(Link),ios::in | ios::out);
struct element 
{ 
  int nk, nl;
  float zn; 
};
strstream&  operator >> (strstream&  in,   element& el) 
{
  in >> el.nk; in >> el.nl; in >> el.zn;
  return in;
};
strstream& operator << (strstream& out, element& el) 
{ 
  out << ' ' << el.nk << ' ' << el.nl << ' ' << el.zn;
  return out; 
};
// Функция чтения из потока и вывода на экран: 
void result(void) 
{ 
  element zuar;
  int numb;
  obmen >> numb;
  cout << "\nnumb = "<< numb;
  for(int j = 0; j < numb; j++) 
    { 
      obmen >> zuar;
      cout << "\nelement[" << j << "] = "; 
      cout << zuar.nk <<  '\t' << zuar.nl << '\t' << zuar.zn;
    }
}
void main()
{   
  char buffer[180];
  const int numbeEl = 5;
  element arel[numbeEl]   = { 1, 2, 3.45, 2, 3, 4.56,
                       22, 11, 45.6, 3, 24, 4.33, 3,  6, -5.3 };
  // Запись в строковый поток:
  obmen << numbeEl;
  for (int i = 0; i < numbeEl; i++) 
    obmen << arel[i];
  obmen << '\0';
  result();
}
Текст этой программы можно взять здесь.

    Результат выполнения программы:

    numb = 5				
    element[0] = 1   2        3.45
    element[1] = 2   3        4.56
    element[2] = 22  11       45.599998
    element[3] = 3   24       4.33
    element[4] = 3   6        -5.3

    Со следующего шага мы начнем рассматривать взаимосвязь файлов и потоков.




Предыдущий шаг Содержание Следующий шаг