Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






Для выполнения операций ввода/вывода данных различных типов без их преобразований предназначены классы 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);

}

}

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.