- •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