Читать данные о предмете хранения,
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!