- •1 Классы потоков
 - •1.3 Символьные классы потоков
 - •2.1.2 Запись данных в консольный входной поток
 - •2.2 Класс FileStream. Файловый побайтовой ввод-вывод
 - •2.2.1 Открытие и закрытие файла
 - •2.2.2 Считывание байт из объекта класса FileStream..
 - •2.3 Файловый ввод-вывод с ориентацией на символы
 - •2.3.1 Использование класса StreamWriter
 - •2.3.2 Использование класса StreamReader
 - •2.4 Перенаправление стандартных потоков
 - •2.5 Считывание и запись двоичных данных
 - •2.5.1 Класс BinaryWriter
 - •Класс BinaryReader
 - •Применение двоичного ввода-вывода
 - •2.7 Считывание входных данных из массива и запись их в массив
 - •2.9 Преобразование числовых строк во внутреннее представление
 
Содержание
Введение. С#-система ввода-вывода……………………………………. 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
- 
Перенаправление стандартных потоков…………………………. 13
 
№ 10……………………………………………………………. 13
- 
Считывание и запись двоичных данных………………………… 15
 
2.5.1 Класс BinaryWriter……………………………………………. 15
2.5.2 Класс BinaryReader …………………………………………… 15
2.5.3 Применение двоичного ввода-вывода………………………. 16
№ 11……………………………………………………………. 16
- 
Файлы с поизвольным доступом…………………………………. 18
 
№ 12 ……………………………………………………………. 18
2.7 Считывание входных данных из массива и запись их в массив… 20
№ 13 ……………………………………………………………. 20
- 
Применение строковых массивов (StringWriter и StringWriter).. 21
 
№ 14…………………………………………………………….. 21
- 
Преобразование числовых строк во внутреннее представление.. 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
