Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч


Download 2.46 Mb.
bet64/91
Sana19.10.2023
Hajmi2.46 Mb.
#1709453
TuriУчебно-методический комплекс
1   ...   60   61   62   63   64   65   66   67   ...   91
Bog'liq
Язык программирования 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
Использования простых побайтовых или, как их еще называют, примитивных потоков не очень удобно, т.к. работать в конечном итоге приходится с отдельными байтами, в то время, как большинство реальных структур данных состоят из большего числа байт. Поэтому типы приходится все время переводить в байтовые цепочки и обратно, а это довольно рутинная работа, да еще и чреватая ошибками.
Для решения этой проблемы используются потоки более высокого уровня, которые обворачивают низкоуровневые потоки, избавляя программиста от необходимости работать с отдельными байтами.



Download 2.46 Mb.

Do'stlaringiz bilan baham:
1   ...   60   61   62   63   64   65   66   67   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling