Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на C++.doc
Скачиваний:
148
Добавлен:
02.05.2014
Размер:
872.96 Кб
Скачать

Последовательный двоичный файловый ввод/вывод

Stream-библиотека C++ имеет перегруженные потоковые функции-элементы write и read для последовательного двоичного файлового ввода/вывода. Функция write посылает ряд байт в выходной поток. Эта функция может записывать любую переменную или экземпляр в поток.

Функция-элемент write

Прототип перегруженной функции-элемента:

ostream& write(const char* buff, int num);

ostream& write(const signed char* buff, int num);

ostream& write(const unsigned char* buff, int num);

Параметр buff - это указатель на буфер, содержащий данные, которые будут посылаться в выходной поток. Параметр num указывает число байт в буфере, которые передаются в этот поток.

Пример 4.

const MAX = 80;

char buff[MAX+1] = "Hello World!";

int len = strlen (buff) + 1;

fstream f;

f.open("CALC.DAT", ios::out | ios::binary);

f.write((const unsigned char*) &len, sizeof(len));

f.write((const unsigned char*) buff, len);

f.close();

В этом примере открывается файл CALC.DAT, записывается целое, содержащее число байт в строке и записывается сама строка перед тем, как файл закрывается.

Функция read считывает некоторое количество байт из входного потока. Эта функция может считывать любую переменную или экземпляр из потока.

Функция-элемент read

Прототип перегруженной функции-элемента read:

ostream& read(char* buff, int num);

ostream& read(signed char* buff, int num);

ostream& read(unsigned char* buff, int num);

Параметр buff - это указатель на буфер, который принимает данные из входного потока. Параметр num указывает число считываемых из потока байт.

Пример 5.

const MAX = 80;

char buff [MAX+1];

int len;

fstream f;

f.open("CALC.DAT", ios::in | ios::binary);

f.read((unsigned char*) &len, sizeof(len));

f.read((unsigned char*) buff, len);

f.close();

В этом примере считывается информация, записанная в предыдущем примере.

Рассмотрим пример, выполняющий последовательный двоичный потоковый ввод/вывод. В листинге 10.2 представлен исходный код программы ARRAY.CPP. Эта программа объявляет класс, который моделирует численный динамический массив. Операции ввода/вывода позволяют программе читать и писать как отдельные элементы массива, так и целый массив в двоичный файл. Эта программа создает массивы arr1, arr2 и аrrЗ, а затем выполняет следующие задачи:

  • Присваивает значения элементам массива arr1. (Этот массив имеет 10 элементов).

  • Присваивает значения элементам массива аrrЗ. (Этот массив имеет 20 элементов).

  • Отображает значения массива arr1.

  • Записывает элементы массива arr1 в файл ARRAY1.DAT (по одному за операцию).

  • Читает элементы массива arr1 из этого файла в массив arr2 (по одному за операцию). (Массив arr2 имеет 10 элементов, то есть он одного размера с массивом arr1).

  • Отображает элементы массива arr2.

  • Отображает элементы массива аrrЗ.

  • Записывает элементы массива аrrЗ в файл ARRAY3.DAT, все сразу.

  • Читает (все сразу) данные из файла ARRAY3.DAT и сохраняет их в массиве arr1.

  • Отображает значения массива arr1. (Выход показывает, что массив arr1 имеет тот же размер, что и массив arr3).