Программирование >>  Структурное программирование 

1 ... 250 251 252 [ 253 ] 254 255 256 ... 342


Введите номер счета (от 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)



Счет

Фамилия

Баланс

Brown

Nancy

-24.54

Dunn

Stacey

314.33

Barker

Doug

0.00

Smith

Dave

258.34

Stone

34.98

Рис. 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 будет содержать:

Счет

Фамилия

Баланс

Brown

Nancy

-24.54

Dunn

Stacey

314.33

Barker

Doug

0.00

Smith

Dave

258.34

Stone

34.98



1 ... 250 251 252 [ 253 ] 254 255 256 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика