Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции C++.doc
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
1.44 Mб
Скачать

8.3 Ввод из массива

Для того, чтобы связать поток ввода с массивом, используется следующий конструктор клас­са 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;

}

8.4 Использование функций-членов класса ios

Доступ к потокам на основе массивов может быть также осуществлен с помощью стандартных функций-членов класса 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. Для ввода массив дол­жен оканчиваться нулем.

Следующая программа использует массив для ввода и для вывода:

#include <strstrea.h>

#include <iostream.h>

int main()

{

char iostr[80];

strstream i(iostr, sizeof(iostr), ios::in | ios::out);

int a, b;

char str[80];

i << "1734 534abcdefghijklmnopqrstuvwxyz";

ios >> a >> b >> str;

cout << a << " " << b << " " << str << endl;

}

Эта программа сначала пишет два числа и буквы алфавита в массив, а затем читает их.