Читать данные о предмете хранения,



item = dataIn.ReadString();  

onhand = dataIn.ReadInt32();

cost = dataIn.ReadDouble();

 

Проверить, совпадает ли он с запрашиваемым предметом.

Если совпадает, то отобразить сведения о нем.

if(item.Equals(what, StringComparison.OrdinalIgnoreCase)) {

Console.WriteLine(item + ": " + onhand + " штук в наличии. " +

"Цена: {0:С} за штуку", cost);

Console.WriteLine("Общая стоимость по наименованию <{0}>: {1:С}.",

item, cost * onhand);

break;

}

}

}

catch(EndOfStreamException) {

Console.WriteLine("Предмет не найден.");

}

catch(IOException exc) {

Console.WriteLine("Ошибка чтения из файла товарных запасов");

Console.WriteLine("Причина: " + exc.Message);

} finally {

dataIn.Close();

}

}

}

 

Выполнение этой программы может привести, например, к следующему результату.

 

Введите наименование для поиска: Отвертки

Отвертки: 18 штук в наличии. Цена: $1.50 за штуку.

Общая стоимость по наименованию <Отвертки>: $27.00.

 

Обратите внимание на то, что сведения о товарных запасах сохраняются в этой программе в двоичном формате, а не в удобной для чтения текстовой форме. Благодаря этому обработка числовых данных может выполняться без предварительного их преобразования из текстовой формы.

Обратите также внимание на то, как в этой программе обнаруживается конец файла. Методы двоичного ввода генерируют исключение EndOfStreamException по достижении конца потока, и поэтому файл читается до тех пор, пока не будет найден искомый предмет или сгенерировано данное исключение. Таким образом, для обнаружения конца файла никакого специального механизма не требуется.

 

 

Файлы с произвольным доступом

 

В предыдущих примерах использовались последовательные файлы , т.е. файлы со строго линейным доступом, байт за байтом. Но доступ к содержимому файла может быть и произвольным. Для этого служит, в частности, метод Seek(), определенный в классе FileStream. Этот метод позволяет установить указатель положения в файле , или так называемый указатель файла , на любое место в файле. Ниже приведена общая форма метода Seek():

 

Long Seek(long offset, SeekOrigin origin)

 

где offset обозначает новое положение указателя файла в байтах относительно заданного начала отсчета (origin). В качестве origin может быть указано одно из приведенных ниже значений, определяемых в перечислении SeekOrigin.

 

Значение - Описание

 

SeekOrigin.Begin - Поиск от начала файла

SeekOrigin.Current - Поиск от текущего положения

SeekOrigin.End  - Поиск от конца файла

 

Следующая операция чтения или записи после вызова метода Seek() будет выполняться, начиная с нового положения в файле, возвращаемого этим методом. Если во время поиска в файле возникает ошибка, то генерируется исключение IOException. Если же запрос положения в файле не поддерживается базовым потоком, то генерируется исключение NotSupportedException. Кроме того, могут быть сгенерированы и другие исключения.

В приведенном ниже примере программы демонстрируется ввод-вывод в файл с произвольным доступом. Сначала в файл записываются прописные буквы английского алфавита, а затем его содержимое считывается обратно в произвольном порядке.

 

// Продемонстрировать произвольный доступ к файлу.

using System;  

using System.IO;

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 K M O Q S U W Y

 

Несмотря на то что метод 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 + " ");

}

 

 


Дата добавления: 2019-02-12; просмотров: 352; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!