Двоичные потоки

  • docx
  • 18.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-002148.docx

 Двоичные потоки

Для выполнения операций ввода/вывода данных различных типов без их преобразований предназначены классы BinaryReader и ВinaryWriter. Важно понимать, что эти данные считываются и записы- ваются с использованием внутреннего двоичного формата, а не в тексто- вой форме, понятной человеку.

Классы BinaryReader и ВinaryWriter представляют собой оболочку для байтового потока, которая управляет чтением\записью двоичных дан- ных.

 

 

 

 

 

 

 

 

 

 

 

 

 

ПРОГРАММАрис.2


Наиболее употребительный конструктор класса BinaryWriter имеет вид:

BinaryWriter ( Stream stream [, Encoding] )

 

Наиболее употребительный конструктор класса BinaryReader имеет вид:

BinaryReader (Stream stream [, Encoding])

stream - поток, в который будут записываться/ считываться данные. Чтобы записать двоичные данные в файл или прочитать из файла,

можно использовать для этого параметра объект, созданный классом

FileStream.

 

Методы вывода данных класса BinaryWriter

Метод

Описание

void Write (sbyte val)

Записывает byte-значение (со знаком)

void Write (byte val)

Записывает byte-значение (без знака)

void Write (byte [ ] buf)

Записывает массив byte-значений

void Write (short val)

Записывает   целочисленное   значение типа short короткое целое)

void Write (ushort val)

Записывает   целочисленное   ushort   -

значение (короткое целое без знака)

void Write (int val)

Записывает   целочисленное   значение типа int

void Write (uint val)

Записывает      целочисленное      uint-

значение (целое без знака)

void Write (long val)

Записывает   целочисленное   значение типа long (длинное целое)

void Write (ulong val)

Записывает     целочисленное     ulong-

значение (длинное целое без знака)

void Write (float val)

Записывает float-значение

void Write (double val)

Записывает double-значение

void Write (char val)

Записывает символ

void Write (char [ ] buf)

Записывает массив символов

void Write (string val)

Записывает string-значение с исполь- зованием его внутреннего представления, которое включает спецификатор длины

 

Методы ввода данных, определенные в классе BinaryReader

Метод

Описание

bool     ReadBoolean()

Считывает bool-значение

byte     ReadByte()

Считывает byte-значение

sbyte   ReadSByte()

Считывает sbyte-значение

byte[ ] ReadBytes(int num)

Считывает num байтов и возвра- щает их в виде массива

char     ReadChar()

Считывает char-значение

char[ ] ReadChars(int num)

Считывает num символов и воз- вращает их в виде массива

double ReadDouble()

Считывает double-значение


float     ReadSingle()

Считывает float-значение

short     Readlnt16()

Считывает short-значение

int                Readlnt32()

Считывает int-значение

long      Readlnt64()

Считывает long-значение

ushort   ReadUInt16()

Считывает ushort -значение

uint      ReadUInt32()

Считывает uint-значение

ulong    ReadUInt64()

Считывает ulong-значение

string    ReadString()

Считывает string-значение, пред- ставленное во внутреннем двоичном формате, который включает специфи- катор длины. Этот метод следует ис- пользовать для считывания строки, которая была записана с помощью

объекта класса BinaryWriter

int        Read ()

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

ла возвращает значение -1

int Read (byte [ ] buf,

int offset, int num)

Делает попытку прочитать num байтов в массив buf, начиная с эле- мента buf[offset], и возвращает коли-

чество успешно считанных байтов

int Read (char [ ] buf,

int offset, int num)

Делает попытку прочитать num символов в массив buf, начиная с эле- мента buf[offset], и возвращает коли-

чество успешно считанных символов

 

Исключения, генерируемые классами BinaryReader и ВinaryWriter:

ArgumentException

поток stream не открыт для вво- да/вывода

ArgumentNullException

поток stream имеет null-значение

IOException

ошибка ввода/вывода

EndOfStreamException

Обнаружен

Read...)

конец

потока

(для

 

Пример. (Без обработки исключений.)

// Запись в файл двоичных данных с последующим их считыванием. using System;

using System.IO;

 

class RWData

{

public static void Main()

{

BinaryWriter            dataOut; BinaryReader dataIn; FileStream                      fs;

 

int                 i = 10;

double          d = 1023.56;


bool b = true;

 

fs = new FileStream ("testdata", FileMode.Create); dataOut = new BinaryWriter (fs);

 

dataOut.Write (i); dataOut.Write (d); dataOut.Write (b); dataOut.Write (12.2 * 7.4);

 

dataOut.Close();

 

// Теперь попробуем прочитать эти данные.

fs = new FileStream ("testdata", FileMode.Open); dataIn = new BinaryReader(fs);

 

i = dataIn.ReadInt32();

d = dataIn.ReadDouble(); b = dataIn.ReadBoolean(); d = dataIn.ReadDouble();

 

dataIn.Close();

 

Console.WriteLine ("Прочитали " + i); Console.WriteLine ("Прочитали " + d); Console.WriteLine ("Прочитали " + b); Console.WriteLine ("Прочитали " + d);

}

}

 

Пример. С обработкой исключений.

// Запись в файл двоичных данных с последующим их считыванием. using System;

using System.IO;

 

class RWData

{

public static void Main()

{

BinaryWriter dataOut;

BinaryReader dataIn;

FileStream fs;

 

int i = 10;

double d = 1023.56; bool b = true;

 

try

{

fs = new FileStream("testdata", FileMode.Create); dataOut = new BinaryWriter(fs);

}

catch (IOException exc)

{


Console.WriteLine(exc.Message + "\nHe удается открыть файл."); return;

}

 

try

{

dataOut.Write(i); dataOut.Write(d); dataOut.Write(b); dataOut.Write(12.2 * 7.4);

}

catch (IOException exc)

{

Console.WriteLine(exc.Message + "\nОшибка при записи.");

}

 

dataOut.Close();

 

// Теперь попробуем прочитать эти данные. try

{

fs = new FileStream("testdata", FileMode.Open); dataIn = new BinaryReader(fs);

}

catch (FileNotFoundException exc)

{

Console.WriteLine(exc.Message + "\nHe удается открыть файл."); return;

}

 

try

{

i = dataIn.ReadInt32();

d = dataIn.ReadDouble(); b = dataIn.ReadBoolean(); d = dataIn.ReadDouble();

}

catch (IOException exc)

{

Console.WriteLine(exc.Message + "Ошибка при считывании.");

}

dataIn.Close(); Console.WriteLine("Прочитали " + i); Console.WriteLine("Прочитали " + d); Console.WriteLine("Прочитали " + b); Console.WriteLine("Прочитали " + d);

}

}