Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_13_14 / ЛАБ_13_C# / Лекция.doc
Скачиваний:
10
Добавлен:
02.02.2015
Размер:
454.66 Кб
Скачать

Содержание

Введение. С#-система ввода-вывода……………………………………. 2

1 Классы потоков………………………………………………………….. 2

1.1 Класс Stream ……………………………………………………….. 2

1.2 Байтовые классы потоков………………………………………… 3

1.3 Символьные классы потоков …………………………………….. 3

1.4 Потоковые классы…………………………………………………. 4

1.5 Двоичные потоки………………………………………………….. 4

2 Практическая реализация ввода-вывода ……………………………… 4

2.1 Консольный ввод-вывод…………………………………………... 4

2.1.1 Считывание данных из консольного входного потока……. 4

№ 1……………………………………………………………… 5

№ 2……………………………………………………………… 5

№ 3……………………………………………………………… 5

2.1.2 Запись данных в консольный входной поток……………… 6

№ 4……………………………………………………………… 6

2.2 Класс FileStream. Файловый побайтовой ввод-вывод…………... 6

2.2.1 Открытие и закрытие файла………………………………… 7

2.2.2 Считывание байт из объекта класса FileStream…………… 8

№ 5……………………………………………………………… 8

2.2.3 Копирования файла (применение класса FileStream)……… 9

№ 6……………………………………………………………… 9

2.2.4 Выполнение копирования файла…………………………… 10

№ 7 …………………………………………………………….. 10

2.3 Файловый ввод-вывод с ориентацией на символы……………… 10

2.3.1 Использование класса StreamWriter………………………… 10

№ 8 …………………………………………………………….. 10

№ 8.1 …………………………………………………………… 12

2.3.2 Использование класса StreamReader………………………… 13

№ 9……………………………………………………………… 13

    1. Перенаправление стандартных потоков…………………………. 13

№ 10……………………………………………………………. 13

    1. Считывание и запись двоичных данных………………………… 15

2.5.1 Класс BinaryWriter……………………………………………. 15

2.5.2 Класс BinaryReader …………………………………………… 15

2.5.3 Применение двоичного ввода-вывода………………………. 16

№ 11……………………………………………………………. 16

    1. Файлы с поизвольным доступом…………………………………. 18

№ 12 ……………………………………………………………. 18

2.7 Считывание входных данных из массива и запись их в массив… 20

№ 13 ……………………………………………………………. 20

    1. Применение строковых массивов (StringWriter и StringWriter).. 21

№ 14…………………………………………………………….. 21

    1. Преобразование числовых строк во внутреннее представление.. 22

№ 15 …………………………………………………………… 23

Лекция №13, Лаб.раб. №13

C#-система ввода-вывода

До настоящего времени рассмотрены наследование и обработка исключений. Наступила очередь рассмотреть иерархию классов. Все это составляет основу системы ввода-вывода С#. Реализация ввода- вывода выполняется с использованием понятия потоков. Поток (stream) – это абстракция, которая позволяет синтезировать (объединять составные части в целое) информацию либо потребляет ее. Поведение потока не зависит от особенностей организации физических устройств ввода-вывода, т.е., например, описание ввода-вывода на консольное устройство можно описать также, как и работу с дисковым файлом.

Отметим сразу, что на самом низком уровне С#-система ввода-вывода ( в дальнейшем ВВ) работает с байтами (byte – 8-битный код). Человек обычно использует понятие символа (char -16-бтный код). В коде ASCII переход от кода char к коду byte проводится просто отбрасыванием старшего байта. Для распространенных Unicode-символов байтовые потоки не подходят. В ВВ используются ряд классов для преобразования байтового потока в символьный и наоборот (для автоматического преобразования byte-char и char-byte ).

В пространстве имен System для этого применяются три встроенных потока, доступ к которым выполняется через свойства Console.In, Console.Out и Console.Error.

Свойство Console.Inотносится к стандартному входному потоку (по умолчанию это клавиатура, пример Console.ReadLine()).

Свойство Console.Out – относится к стандартному выходному потоку (по умолчанию это консоль, пример Console.WriteLine()).

Свойство Console.Error – относится к ошибкам в стандартном потоке (по умолчанию это консоль).

Эти потоки могут быть переориентированы на любое совместимое устройство ввода-вывода. Эти потоки работают с символами (записывают и считывают символы).

В С# определены байтовые и символьные потоки. Все классы потоков определены в постранстве имен System.IO. Для работы с ними в начале текста пограммы следует включать инструкцию using System.IO;. Так как класс Console определен в пространстве имен System для него эту инструкцию не включают.

1 Классы потоков

1.1 Класс Stream (System.IO.Stream) – абстрактный байтовый поток, базовый для остальных потоковых классов. Распространенные методы этого класса:

Метод

Описание

1

void Close()

Закрывает поток

2

void Flush()

Записывает содержимое потока в физическое устройство

3

Int ReadByte()

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

4

Int Read(byte[ ] buf, int jffset,int numBytes)

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

5

Long Seek(long jffset, SeekOrigin origin)

Устанавливает текущую позицию потока равной указанному значению смещения от заданного начала отсчета

6

Void WriteByte()byte b

Записывает один байт в выходной поток

7

Void Write(byte[] buf, int offset, int numBytes)

Записывает поддиапазон размером numbytes байт из массива buf, начиная с элемента buf[offset]

Ошибки ввода-вывода сопровождаются исключением IOException, при некорректной операции вырабатывается NotSupportedException.

Ниже в таблице описаны несколько свойств класса Stream

Свойство

Описание

1

Bool CanRead

Свойство равно true, если из потока можно считывать данные. Свойство предназначено для чтения

2

Bool CanSeek

Свойство равно true, если поток поддерживает функцию установки в заданную позицию (предназначено только для чтения)

3

Bool CanWrite

Свойство равно true, если в поток можно записывать даные (только для чтения)

4

Long Length

Свойство содержит длинну потока (только для чтения)

5

Long Position

Свойство представляет текущую позицию потока (можно как читать, так и устанавливать)

1.2 Байтовые классы потоков (выделены из класса Stream)

Класс потока

Описание

1

BufferedStream

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

2

MemoryStream

Байтовый поток, разработанный для ввода-вывода

3

Bool CanWrite

Байтовый поток, который использует память для хранения даннных

1.3 Символьные классы потоков

Для создания символьного потока следует поместить байтовый поток в одну из символьных С#-оболочек. В вершине иерархии символьных потоков находятся абстрактные классы TextReader (для ввода данных) и TextWriter (для вывода данных). Ниже приведены методы ввода данных, определенных в классе TextReader.

Метод

Описание

1

void Close()

Закрывает источник ввода данных

2

int Peek()

Получает следующий символ из входного потока, но не удаляет его. Возвращает -1.если ни один символ не доступен

3

int Read()

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

4

Int Read(char[ ] buf, int offset, int numChars)

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

5

Int ReadBlock(char[ ]buf, int offset, int numChars)

Делает попытку прочитатm numChars символов в массив buf, начиная с элемента buf[offset], возвращает количество успешно прочитанных символов

6

String ReadLine()

Считывает следующую строку текста и возвращает ее как string-значение. При попытке прочитать признак конца файла возвращает null-значение

7

String ReadToEnd()

Считывает все символы, оставшиеся в потоке, и возвращает их как string-значение

В классе TextWriter определены методы Write() и WriteLine(). Ниже приведены основные из них.

Метод

Описание

1

void Write(int val)

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

2

Void Write(double val)

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

3

Void Write(bool val)

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

4

VoidWriteLine(string val)

Записывает значение типа string c последующим символом новой строки

5

VoidWriteLine(unit val)

Записывает значение типа unit c последующим символом новой строки

6

VoidWriteLine(char val)

Записывает символ с последуюшим символом новой строки

1.4 Потоковые классы, определенные в классах TextReader и TextWriter

Потоковые классы

Описание

1

StreamReader

Предназначен для чтения символов из байтового потока. Этот класс является оболочкой для байтового входного потока

2

StreamWriter

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

3

StringReader

Предназначен для чтения символа из строки

4

StringWriter

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

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

В С# определены два двоичных потока для прямого считывания и записи двоичных данных – BinaryReader и BinaryWriter для работы с двоичными файлами.

2 Практическая реализация ввода-вывода

2.1 Консольный ввод-вывод

2.1.1 Считывание данных из консольного входного потока

Класс TextReader → поток Console.In →

Класс Console → поток Console.In → методы Read()/ReadLine() – два метода для считывания одного символа/строки символов. Опишем считывание одного символа, описание методов static int Read() / static string ReadLine().

При выполнении Read() →ожидается нажатие клавиши → возввращается тип int → необходимо преобразовать в (char) →[Enter] → во входной поток вводятся два символа – возврат каретки + перевод строки, которые, как правило, перед следующем вводе следует удалить (просто считыванием из потока)

  • при ошибке →возврат -1,

  • при сбое → исключение IOException

Ниже приведены три фрагмента текста программы: считывание символа (Read()), считывание строки методом класса Console(Console.ReadLine()) и считывание строки методом базового класса TextReader.

№ 1

Рис 1 Ввод символа с клавиатуры

№ 2

// Ввод строки с помощью ReadLine()

сlass ReadString {

public static void Main()

{

string str;

Console.WriteLine("Ввести строку.");

str = Console.ReadLine();

Console.WriteLine(" Вы ввели: " + str);

}

}

Рис 2 Ввод строки с клавиатуры

№ 3

// Ввод строки с клавиатуры с потоком Console.In (с методом класса TextReader)

class ReadChars2

public static void Main()

{ string str;

Console.WriteLine("Ввести строку символов. ");

str = Console.In.ReadLine();

Console.WriteLine(" Введена строка : " + str);

}

}

Рис 3 Ввод строки с консоли с обращением к методу класса TextReader

Соседние файлы в папке ЛАБ_13_C#