Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 10.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
142.93 Кб
Скачать

Классы BinaryReader и BinaryWriter

Кроме байтовых и символьных потоков в языке C# реализованы двоичные потоки для работы с примитивными типами данных, такими как int, double, short и др. Двоичные потоки хранят значения в двоичном коде и не предназначены для просмотра их человеком.

Двоичный поток открывается на основе базового потока, который, в частности может быть инициализирован с помощью класса FileStream.

Так конструктор BinaryReader(<ИмяБазовогоПотока>) открывает двоичный поток для считывания данных из файла, ассоциированного с заданным базовым потоком.

Некоторые свойства и методы класса BinaryReader приведены в таблице 5.

Таблица 10.5

Свойства и методы класса BinaryReader

Название

Вид

Описание

BaseStream

неизменяемое свойство

Предоставляет доступ к базовому потоку

Close()

экземплярный метод

Закрывает текущий и связанный с ним базовый поток

PeekChar()

экземплярный метод

Возвращает следующий доступный для чтения символ в формате int, не перемещая внутренний указатель текущего положения в потоке. Если доступного для чтения символа нет, возвращает значение –1

Read()

экземплярный метод

Считывает текущий символ из базового потока и перемещает внутренний указатель потока на один символ, либо возвращает значение –1, если доступных для чтения символов нет

Метод Read() перегружен и имеет несколько вариантов реализации. Так, его можно использовать для считывания из базового потока последовательности байтов определенной длины и записи их в одномерный массив с указанного индекса; метод при этом возвращает количество считанный из потока байт, либо ноль, если достигнут конец потока. Также метод Read() может считывать из базового потока последовательность символов.

Кроме того, в классе BinaryReader определены методы, реализующие считывание из базового потока значений всех встроенных в C# примитивных типов. Синтаксис таких методов одинаков и имеет вид: ReadXX(), где вместо XX указывается соответствующий тип данных. Например, метод ReadBoolean() считывает из базового потока величину типа Boolean (bool) и перемещает внутренний указатель потока на соответствующее количество байт вперед в зависимости от типа считанной величины, в данном случае на один байт.

Конструктор BinaryWriter(<ИмяБазовогоПотока>) открывает двоичный поток для записи данных в файл, ассоциированный с заданным базовым потоком. Основные методы приведены в таблице 10.6.

Таблица 10.6

Методы класса BinaryWriter

Название

Описание

Flush()

Записывает данные из буфера в связанный с потоком источник данных (файл) и очищает буфер

Seek()

Устанавливает позицию указателя в текущем потоке (имеет тот же синтаксис, что и аналогичный метод класса Stream)

Write()

Записывает заданное значение в текущий поток

Close()

Закрывает текущий и связанный с ним базовый поток

Приведем пример записи в файл и чтения из файла данных разных типов с использованием двоичных потоков.

try

{

FileStream MyFile = new FileStream("input.txt", FileMode.Create,

FileAccess.Write);

BinaryWriter MyBinaryFile = new BinaryWriter(MyFile);

MyBinaryFile.Write("Ivanov");

MyBinaryFile.Write("PM-11");

MyBinaryFile.Write(1);

MyBinaryFile.Write(true);

MyBinaryFile.Write("Petrov");

MyBinaryFile.Write("PM-21");

MyBinaryFile.Write(2);

MyBinaryFile.Write(false);

MyBinaryFile.Close();

}

catch

{

Console.WriteLine("Ошибка ввода");

}

Здесь мы записываем в двоичный поток информацию о двух студентах: фамилию, группу, курс и логическую величину, указывающую, проживает ли студент в общежитии.

Считывание введенных таким образом данных в файл, можно организовать следующим образом:

try

{

FileStream MyFile = new FileStream("input.txt", FileMode.Open,

FileAccess.Read);

BinaryReader MyBinaryFile = new BinaryReader(MyFile);

Console.Write("Name: " + MyBinaryFile.ReadString());

Console.Write("\tGroup: " + MyBinaryFile.ReadString());

Console.Write("\tCourse: " + MyBinaryFile.ReadInt32());

Console.WriteLine("\tLiving in a hostel: " +

MyBinaryFile.ReadBoolean());

Console.Write("Name: " + MyBinaryFile.ReadString());

Console.Write("\tGroup: " + MyBinaryFile.ReadString());

Console.Write("\tCourse: " + MyBinaryFile.ReadInt32());

Console.WriteLine("\tLiving in a hostel: " +

MyBinaryFile.ReadBoolean());

MyBinaryFile.Close();

}

catch

{

Console.WriteLine("Ошибка ввода");

}

Отметим, что для проверки работоспособности программы, считанные из файла данные, выводятся на экран, поскольку файлы, созданные с помощью класса BinaryWriter, не предназначены для просмотра человеком, а обычно создаются для использования в программах.