|
Программирование >> Структурное программирование
Введите номер счета (от 1 до 100, О - конец ввода) ? 37 Введите фамили , имя, баланс ? Barker Doug 0.00 Введите номер счета ? 29 Введите фамилию, имя, баланс ? Brown Nancy -24.54 Введите номер счета ? 96 Введите фамилию, имя, баланс ? Stone Sam 34.98 Введите номер счета ? 88 Введите фамилию, имя, баланс ? Smith Oave 258.34 Введите номер счета ? 33 Введите фамилию, имя, балгшс ? Dunn Stacey 314.33 Введите номер счета ? О Рис 14.13. Пример выполнения программы, приведенной на рис. 14.12 14.10. Последовательное чтение данных из файла произвольного доступа в предыдущих разделах был создан файл произвольного доступа и были записаны данные в этот файл. В этом разделе создадим программу, которая последовательно читает файл от начала до конца, и печатает те записи, которые содержат данные. Такие программы дают определенные выгоды. По-пробзте определить, в чем они заключаются; мы вернемся к этому в конце данного раздела. Функция read класса istream вводит в объект определенное число байтов с текущей позиции в указанном потоке. Например, оператор inCredit.read((char *) Sclient, sizeof (client)); ИЗ программы на рис. 14.4 считывает число байтов, определяемое при помощи sizeof(client) из файла, связанного с объектом inCredit класса ifstream, и сохраняет данные в структуре client. Заметим, что функция read требует первый аргумент типа char *. Поскольку &client имеет тип clientData *, то &client должен быть приведен к типу char *. Программа на рис. 14.14 последовательно читает каждзпю запись в файле credit.dat , проверяет, содержатся ли в ней данные, и выводит на экран форматированные выходные данные для записей, содержащих данные. Условие ! inCredit.eofО использует функцию-элемент eof объекта ios для определения конца файла и вызывает завершение выполнения структуры while. Введенные данные из файла выводятся на экран функцией outputLine, которая принимает два аргумента - объект ostream и структуру clientData. figl4 14.cpp Последовательное чтение из файла произвольного доступа tinclude <iostream.h> tinclude <iomanip.h> tinclude <fstreain.h> tinclude <stdlib.h> struct clientData { int acctNum; char lastName[15]; char firstName[10]; float balance; void outputLine(ostreamS, clientData); mam ( { ifstream inCredit( credit.dat , ios::in); if (! inCredit) { cerr << Файл не может быть открыт. endl; exit (1) ; cout setiosflags(ios::left) setw(6) Счет setw(16) Фамилия setw(ll) Имя setiosflags(ios::right) setw(10) Баланс endl; clientData client; inCredit.read((char *)sclient, sizeof(clientData)); while (! inCredit.eof0) { if (client.acctNum != 0) outputLine(cout, client); inCredit.read((char *)Sclient, sizeof(clientData)); return 0; void outputLine(ostream Soutput, clientData c) output setiosflags(ios::left) setw(6) << c.acctNum setw(16) c.lastName setw(ll) c.firstName << setw(lO) setprecision(2) << setiosflags(ios::showpoint ios::right) c.balance endl; Рис. 14.14. Последовательное чтение с помощью файла произвольного доступа (часть 1 из 2)
Рис. 14.14. Последовательное чтение с помощью файла произвольного доступа (часть 2 из 2) Итак, какие это дает дополнительные преимущества? Если вы посмотрите результаты вывода, то заметите, что записи перечислены в виде упорядоченной последовательности (по номеру счета). Это является простым следствием того, что мы хранили эти записи в файле, используя методы прямого доступа. По сравнению с пузырьковой сортировкой (глава 4) сортировка с использованием методов прямого доступа заведомо быстрее. Скорость, достигаемая при создании файла, вполне достаточна для сохранения всех мыслимых данных. Правда, файл может оказаться сильно разреженным, что приводит к нерациональному расходу памяти. Таким образом, это еще один пример компромисса в соотношении память - время : использование больших объемов памяти позволяет создать более быстрый алгоритм сортировки. 14.11. Пример: программа обработки запросов Теперь рассмотрим реальную программу обработки запросов (рис. 14.15), использующую файл произвольной выборки для действительно мгновенного доступа. Программа оперирует с информацией по банковским счетам. Программа обновляет существующие счета, добавляет новые счета, уничтожает старые, создает текстовый файл для форматированной печати всех текущих счетов. Допустим, что выполнена программа на рис. 14.11 и создан файл credit.dat, а программой на рис. 14.12 выполнена вставка в файл начальных данных. Программа имеет пять опций. Опция 1 вызывает функцию textFile, которая создает текстовый файл с именем print.txt для последующей форматированной печати. Функция textFile принимает объект fstream в качестве аргумента, который используется при вводе данных из файла credit.dat. Функция textFile использует функцию-элемент read класса istream и методы последовательного доступа к файлу (см. рис. 14.14) для ввода данных из файла credit.dat. Функция outputLine, которая была обсуждена в разделе 14.10, используется для вывода данных в файл print.txt. Заметим, что функция textFile использует функцию-элемент seekg класса istream для того, чтобы указатель позиции указывал на начало файла. После выбора опции 1 файл print.txt будет содержать:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |