Для того, чтобы связать поток ввода с массивом, используется следующий конструктор класса istrstream:
istrstream istr(char *buf);
Здесь buf представляет собой указатель на массив, который будет использоваться как источник символов всякий раз при выполнении ввода из потока istr. Массив, на который указывает указатель buf, должен завершаться нулевым символом. Однако нулевой символ никогда не читается из массива.
Ниже приведен пример, использующий строку в качестве ввода:
#include <strstrea.h>
#include <iostream.h>
int main()
{
char s[] = "One 2 3.00";
istrstream ins(s);
int i;
char str[80];
float f;
// чтение: one 2
ins >> str;
ins >> i;
cout << str << " " << i << endl;
// чтение 3.00
ins >> f;
cout << f << '\n';
return 0;
}
Если необходимо, чтобы только часть строки была использована для ввода, то надо применить следующую форму конструктора istrstream:
istrstream istr(char *buf, int size);
Здесь только первые size элементов массива будут использованы для ввода. Эта строка не обязательно должна оканчиваться нулевым символом, поскольку именно величина size определяет размер строки.
Связанный с памятью поток ведет себя точно так же, как потоки, связанные с устройствами. Например, следующая программа иллюстрирует способ, с помощью которого может быть прочитан текст, оканчивающийся нулевым символом в массиве. Когда достигается конец массива, поток ins принимает значение NULL.
#include <strstrea.h>
#include <iostream.h>
int main()
{
char s[] = "C++ arrays are fun! 123.23 0x23\n";
istrstream ins(s);
char ch;
ins.unsetf(ios::skipws); // не пропускать пробелы
while(ins) // нуль в случае достижения конца массива
{
ins >> ch;
cout << ch;
}
return 0;
}
Доступ к потокам на основе массивов может быть также осуществлен с помощью стандартных функций-членов класса ios, таких как get() и put(). Также можно использовать функцию eof() для того, чтобы определить, когда будет достигнут конец массива. Например, следующая программа показывает, как прочитать содержимое массива с использованием функции get():
#include <strstrea.h>
#include <iostream.h>
int main()
{
char s[] = "This is a test array\23\22\21\a\t\n";
istrstream ins(s);
char ch;
while(!ins.eof())
{
ins.get(ch);
cout << ch;
}
return 0;
}
В данном примере величины, форматированные следующим образом \23\22\21 являются нетекстовыми управляющими символами CTRL-W, CTRL-V и CTRL-U. Знак \t является символом табуляции. Таким образом могут быть прочитаны данные любого типа.
Если необходимо прочесть данные из буфера, то можно использовать функцию-член read(). Для записи данных в буфер используется функция write().
8.5 Потоки ввода/вывода в массивы
Для создания потока, способного вводить и выводить данные в массив, надо использовать следующий конструктор класса strstream:
strstream iostr(char *buf, int size, int mode);
Здесь buf указывает на строку, используемую для операций ввода/вывода. Величина size содержит размер массива. Параметр mode служит для определения режима. Для нормальных операций ввода/вывода параметру mode присваивается значение ios::in | ios::out. Для ввода массив должен оканчиваться нулем.
Следующая программа использует массив для ввода и для вывода:
Эта программа сначала пишет два числа и буквы алфавита в массив, а затем читает их.
Важно помнить, что все обычные операции ввода/вывода сохраняют свое значение для ввода/вывода в массивы. Сюда относится также произвольный доступ с использованием функций seekg() и seekp(). В качестве примера следующая программа получает восьмой символ в iostr и выводит его. (Выводится символ h.)