C# 4.0 полное руководство - 2011
Шрифт:
long Seek(long offset, SeekOrigin origin)
где offset обозначает новое положение указателя файла в байтах относительно заданного начала отсчета (origin). В качестве origin может быть указано одно из приведенных ниже значений, определяемых в перечислении SeekOrigin.
Значение
Описание
SeekOrigin.Begin
Поиск
SeekOrigin.Current
Поиск от текущего положения
SeekOrigin.End
Поиск от конца файла
Следующая операция чтения или записи после вызова метода Seek будет выполняться, начиная с нового положения в файле, возвращаемого этим методом. Если во время поиска в файле возникает ошибка, то генерируется исключение IOException. Если же запрос положения в файле не поддерживается базовым потоком, то генерируется исключение NotSupportedException. Кроме того, могут быть сгенерированы и другие исключения.
В приведенном ниже примере программы демонстрируется ввод-вывод в файл с произвольным доступом. Сначала в файл записываются прописные буквы английского алфавита, а затем его содержимое считывается обратно в произвольном порядке.
// Продемонстрировать произвольный доступ к файлу.
using System; using System.10;
class RandomAccessDemo { static void Main {
FileStream f = null; char ch;
try {
f = new FileStream("random.dat", FileMode.Create);
// Записать английский алфавит в файл, for (int i=0; i < 26; i++) f.WriteByte((byte)('A'+i));
//А теперь считать отдельные буквы английского алфавита. f.Seek(0, SeekOrigin.Begin); // найти первый байт ch = (char) f. ReadByte ;
Console.WriteLine("Первая буква: " + ch) ;
f.Seek(l, SeekOrigin.Begin); // найти второй байт ch = (char) f. ReadByte ;
Console.WriteLine("Вторая буква: " + ch);
f.Seek(4, SeekOrigin.Begin); // найти пятый байт ch = (char) f.ReadByte ;
Console.WriteLine("Пятая буква: " + ch) ;
Console.WriteLine ;
//А теперь прочитать буквы английского алфавита через одну.
Console.WriteLine("Буквы алфавита через одну: "); for(int i=0; i < 26; i += 2) {
f.Seek(i, SeekOrigin.Begin); // найти i-й символ ch = (char) f.ReadByte ;
Console.Write(ch + " ") ;
}
}
catch(IOException exc) {
Console.WriteLine("Ошибка ввода-вывода\п" + exc.Message);
'} finally {
if(f != null) f.Close;
}
Console.WriteLine ;
}
}
При
Перзая буква: А Вторая буква: В Пятая буква: Е
Буквы алфавита, через одну:
АСЕ G‘I KMOQSUWY
Несмотря на то что метод Seek имеет немало преимуществ при использовании с файлами, существует и другой способ установки текущего положения в файле с помощью свойства Position. Как следует из табл. 14.2, свойство Position доступно как для чтения, так и для записи. Поэтому с его помощью можно получить или же установить текущее положение в файле. В качестве примера ниже приведен фрагмент кода из предыдущей программы записи и чтения из файла с произвольным доступом random.dat, измененный с целью продемонстрировать применение свойства Position.
Console.WriteLine("Буквы алфавита через одну: "); for(int i=0; i < 26; i += 2) {
f.Position = i; // найти i-й символ посредством свойства Position ch = (char) f.ReadByte;
Console.Write(ch + " ");
}
Применение класса MemoryStream
Иногда оказывается полезно читать вводимые данные из массива или записывать выводимые данные в массив, а не вводить их непосредственно из устройства или выводить прямо на него. Для этой цели служит класс MemoryStream. Он представляет собой реализацию класса Stream, в которой массив байтов используется для ввода и вывода. В классе MemoryStream определено несколько конструкторов. Ниже представлен один из них:
MemoryStream(byte[ ] buffer)
где buffer обозначает массив байтов, используемый в качестве источника или адресата в запросах ввода-вывода. Используя этот конструктор, следует иметь в виду, что массив buffer должен быть достаточно большим для хранения направляемых в него данных.
В качестве примера ниже приведена программа, демонстрирующая применение класса MemoryStream в операциях ввода-вывода.
// Продемонстрировать применение класса MemoryStream.
using System; using System.10;
class MemStrDemo { static void Main {
byte[] storage = new byte[255];
// Создать запоминающий поток.
MemoryStream memsttm = new MemoryStream(storage);
// чтения и записи данных в потоки.
StreamWriter memwtr = new StreamWriter(memstrm);