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