Далее следует более практический пример, демонстрирующий, насколько эффек тивным может быть двоичный ввод-вывод. Для учета каждого предмета хранения на складе в приведенной ниже программе сначала запоминается наименование предме та, имеющееся в наличии, количество и стоимость, а затем пользователю предлагается ввести наименование предмета, чтобы найти его в базе данных. Если предмет найден, отображаются сведения о его запасах на складе. /* Использовать классы BinaryReader и BinaryWriter для реализации простой программы учета товарных запасов. */ using System; using System.IO; class Inventory { static void Main { BinaryWriter dataOut; BinaryReader detaIn; string item; // наименование предмета int onhand; // имеющееся в наличии количество double cost; // цена try { dataOut = new BinaryWriter(new FileStream("inventory.dat", FileMode.Create)); } catch(IOException exc) { Console.WriteLine("He удается открыть файл " + "товарных запасов для вывода"); Console.WriteLine("Причина: " + exc.Message); return; } // Записать данные о товарных запасах в файл. try { dataOut.Write("Молотки"); dataOut.Write(10); dataOut.Write(3.95); dataOut.Write("Отвертки"); dataOut.Write(18); dataOut.Write(1.50); dataOut.Write("Плоскогубцы"); dataOut.Write(5); dataOut.Write(4.95); dataOut.Write("Пилы"); dataOut.Write(8); dataOut.Write(8.95); } catch(IOException exc) { Console.WriteLine("Ошибка записи в файл товарных запасов"); Console.WriteLine("Причина: " + exc.Message); } finally { dataOut.Close; } Console.WriteLine; // А теперь открыть файл товарных запасов для чтения. try { dataIn = new BinaryReader(new FileStream("inventory.dat", FileMode.Open)); } catch(IOException exc) { Console.WriteLine("He удается открыть файл " + "товарных запасов для ввода"); Console.WriteLine("Причина: " + exc.Message); return; } // Найти предмет, введенный пользователем. Console.Write("Введите наименование для поиска: "); string what = Console.ReadLine; Console.WriteLine; try { for(;;) { // Читать данные о предмете хранения. 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.Glose; } } }
Выполнение этой программы может привести, например, к следующему результату. Введите наименование для поиска: Отвертки Отвертки: 18 штук в наличии. Цена: $1.50 за штуку. Общая стоимость по наименованию <Отвертки>: $27.00.
Обратите внимание на то, что сведения о товарных запасах сохраняются в этой про грамме в двоичном формате, а не в удобной для чтения текстовой форме. Благодаря этому обработка числовых данных может выполняться без предварительного их пре образования из текстовой формы.
Обратите также внимание на то, как в этой программе обнаруживается конец фай ла. Методы двоичного ввода генерируют исключение EndOfStreamException по до стижении конца потока, и поэтому файл читается до тех пор, пока не будет найден искомый предмет или сгенерировано данное исключение. Таким образом, для обна ружения конца файла никакого специального механизма не требуется. Файлы с произвольным доступом