Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч
Язык программирования C#
FileShare.ReadWrite
|
Разрешает другим программам любое обращение к файлу |
Приведем теперь пример использования простого файлового потока. Создадим программу, записывающую в файл и считывающую из него однобайтовые беззнаковые числа.
using System;
using System.IO;
class Program
{
static string FileName = " 256 bytes";
static byte RecordsAmount = 255;
private static void WriteToFile()
{
FileStream OutputStream= new FileStream(FileName,FileMode.Create,FileAccess.Write);
byte i;
for (i = 0; i < RecordsAmount; i++)
OutputStream.WriteByte(i);
OutputStream.WriteByte(i);
OutputStream.Close();
}
private static void ReadFromFile()
{
long CurrentPosition;
FileStream InputStream = new FileStream(FileName, FileMode.Open, FileAccess.Read);
CurrentPosition = InputStream.Length;
while (CurrentPosition > 0)
{
InputStream.Position = CurrentPosition - 1;
Console.WriteLine(InputStream.ReadByte());
CurrentPosition--;
}
InputStream.Close();
}
static void Main(string[] args)
{
WriteToFile();
ReadFromFile();
}
}
Лист. 5.2
Программа создает файл с именем FileName и записывает в него 256 целых чисел типа byte, а затем считывает, записанные числа, в обратном порядке. Рассмотрим теперь методы WriteToFile() и ReadFromFile(), используемые соответственно для записи в файл и чтения из него, более подробно. Начнем с метода WriteToFile(). Начинается он с открытия файлового потока для записи.
FileStream OutputStream = new FileStream(FileName, FileMode.Create, FileAccess.Write);
Лист. 5.3
Приведенный конструктор открывает файл с именем FileName, в режиме FileMode.Create, т.е. файл создается в любом, не зависимо от того существует он или нет, и с правами FileAccess.Write, т.е. файл открывается только для записи. При использовании этого конструктора способ разделения доступа не указывается и применяется доступ по умолчанию, т.е. эксклюзивное открытие файла. Далее, посредством метода WriteByte(), в файловый поток записываются 256 последовательных целых чисел от 0 до 255.
for (i = 0; i < RecordsAmount; i++)
OutputStream.WriteByte(i);
OutputStream.WriteByte(i);
Лист. 5.4
После работы с потоком его необходимо закрыть. Это необходимо, для того чтобы, во-первых, избежать потери данных, во-вторых, чтобы освободить ресурсы.
OutputStream.Close();
Лист. 5.5
Теперь рассмотрим метод ReadFromFile(). Он выполняет противоположенную методу WriteToFile() функцию, но при этом их коды практически идентичны. Начинается этот метод, как и предыдущий с открытия файлового потока, но на этот раз для чтения.
FileStream InputStream = new FileStream(FileName, FileMode.Open, FileAccess.Read);
Лист. 5.6
Приведенный конструктор открывает файл с именем FileName, в режиме FileMode.Open, т.е. файл должен существовать до его открытия, в противном случае возникнет исключительная ситуация, и с правами FileAccess.Read, т.е. файл открывается только для чтения. При использовании этого конструктора способ разделения доступа не указывается и применяется доступ по умолчанию, т.е. эксклюзивное открытие файла. Далее, посредством метода ReadByte() и постоянного смещения текущего указателя, файловый поток считывается от конца к началу. Считываемые данные выводятся на печать так, что в результате получаем числа от 255 до 0.
CurrentPosition = InputStream.Length;
while (CurrentPosition > 0)
{
InputStream.Position = CurrentPosition - 1; Console.WriteLine(InputStream.ReadByte());
CurrentPosition--;
}
Лист. 5.7
Сначала в переменную CurrentPosition заноситься размер файлового потока в байтах. Затем в цикле при каждой итерации, потоковому указателю InputStream.Position присваивается значение на единицу меньшее, чем CurrentPosition, это делается из-за того, что байты в потоке номеруются от 0 до его длины минус 1. Затем из потока считывается очередной байт посредством метода InputStream.ReadByte() и этот байт выводится. В конце итерации указатель CurrentPosition уменьшается на 1, чтобы передвинуть его на очередной байт назад. После работы с потоком его необходимо закрыть. Это необходимо, для того чтобы, во-первых, избежать потери данных, во-вторых, чтобы освободить ресурсы.
Вывод программы.
Программа выводит числа от 255 до 0.
Вывод. 5.1
Использования простых побайтовых или, как их еще называют, примитивных потоков не очень удобно, т.к. работать в конечном итоге приходится с отдельными байтами, в то время, как большинство реальных структур данных состоят из большего числа байт. Поэтому типы приходится все время переводить в байтовые цепочки и обратно, а это довольно рутинная работа, да еще и чреватая ошибками.
Для решения этой проблемы используются потоки более высокого уровня, которые обворачивают низкоуровневые потоки, избавляя программиста от необходимости работать с отдельными байтами.
Do'stlaringiz bilan baham:
ma'muriyatiga murojaat qiling