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

Глава 8. Ввод/вывод в массивы

В дополнение к вводу/выводу на консоль и в файлы, система ввода/вывода языка C++ позволяет осуществлять ввод/вывод в массивы. Ввод/вывод на основе массивов использует память в качестве устройства для ввода и вывода. Ввод/вывод на основе массивов осуществляется с помощью обыч­ных потоков C++. Фактически вся представленная в предыдущей главе информация применима к вводу/выводу на основе массивов. Единственное, что отличает ввод/вывод на основе массивов, заключается в том, что связанным с потоком устройством служит память.

В некоторой литературе по C++ ввод/вывод на основе массивов (array-based I/O) называют также вводом/выводом в память (in-RAM I/O). Поскольку потоки способны форматировать ин­формацию, то иногда ввод/вывод на основе массивов называют также форматированием в памя­ти (in-RAM formatting).

Вывод на основе массивов C++ подобен использованию функций sprintf() и sscanf() в языке С. В обоих случаях память используется в качестве устройства для ввода и вывода.

Для использования ввода/вывода на основе массивов необходимо включить в программу заго­ловочный файл strstrea.h.

8.1 Классы ввода/вывода в массивы

Классами для ввода/вывода на основе массивов являются istrstream, ostrstream и strstream. Эти классы используются для создания потоков ввода, вывода и ввода/вывода соответственно. Класс istrstream имеет в качестве базового класса istream. Класс ostrstream порожден от класса ostream, а класс strstream – от класса iostream. Поэтому все классы для вывода на основе массивов имеют доступ к тем же функциям, что и «нормальные» классы ввода/вывода.

8.2 Создание потока вывода

Для того, чтобы связать поток вывода с массивом, используется конструктор ostrstream:

ostrstream ostr(char *buf, int size, int mode=ios::out);

Здесь buf служит указателем на массив, который будет использоваться для хранения символов, записанных в поток ostr. Размер массива передается параметром size. По умолчанию поток открыт для нормального вывода, но, используя различные режимы, объединенные с помощью побитового ИЛИ, можно задать необходимый режим. Подробности обсуждались в предыдущей главе. Например, можно вклю­чить ios::app для того, чтобы выводимые данные были записаны в конец той информации, которая уже содержится в массиве.

После открытия потока вывода в массив, все выводимые в поток данные будут помещаться в массив. Однако никаких данных не будет записано за пределы массива. Попытка выполнить та­кую запись приведет к ошибке.

Ниже представлена простая программа, иллюстрирующая поток вывода в массив:

#include <strstrea.h>

#include <iostream.h>

int main()

{

char str[80];

int a = 10;

ostrstream outs(str, sizeof(str));

outs << "Hello there " << a+44 << hex << " ";

outs.setf(ios::showbase);

outs << 100 << ends;

cout << str; // вывод строки на консоль

return 0;

}

Эта программа выводит текст «Hello there 54 0x64». Надо иметь в виду, что outs является потоком, подобно любому другому потоку, и поэтому он имеет те же возможности, что и любой из рассмотренных выше потоков. Единственная разница заключается в том, что поток связан с памятью. Поскольку outs является потоком, то можно использовать манипуляторы наподобие hex или ends. Функции-члены класса ostream, такие как setf(), также сохраняют свое значение.

Если необходимо, чтобы массив для хранения данных завершался нулевым символом, необходи­мо явным образом записать данный нулевой символ. В предыдущей программе манипулятор ends использовался для создания строк, оканчивающихся нулем, но можно также использовать ‘\0’.

Если нет полной уверенности в том, что происходит в предыдущей программе, то надо срав­нить ее со следующей программой на языке С. Эта программа в функциональном отношении эквивалентна предыдущей С++-версии. Отличие заключается в том, что в ней для вывода в массив используется функция sprinf().

#include <stdio.h>

int main()

{

char str[80];

int a = 10;

sprintf(str, "Hello there %d %#x", a+44, 100);

printf (str);

return 0;

}

Можно определить количество символов в массиве с помощью вызова функции-члена pcount(). Она имеет следующий прототип:

int pcount();

Число, возвращаемое функцией pcount() также включает нулевой символ, если он существует.

Следующая программа иллюстрирует использование функции pcount(). Она сообщает, что в потоке outs содержится 17 символов — 16 букв и нулевой символ.

#include <strstrea.h>

#include <iostream.h>

int main()

{

char str[80];

ostrstream outs(str, sizeof(str));

outs << "Hello " << 34 << " " << 1234.23;

outs << ends; // завершение нулем

cout << outs.pcount(); // вывод числа символов в потоке outs

cout << " " << str;

return 0;

}