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

1 ... 248 249 250 [ 251 ] 252 253 254 ... 342


ЦН

case 2:

cout << endl << Счета с кредитовым балансом endl;

while (! inClientFile.eof О ) { if (balance < 0)

outputLine(account, name, balance);

inClientFile >> account >> name >> balance;

i )

break; case 3:

cout << endl Счета с дебетовым сальдо

endl;

while (! inClientFile.eof () ) { if (balance > 0)

outputLine(account, name, balance);

inClientFile account name balance;

}

break;

inClientFile.clear 0 ; Установка на начало файла inClientFile.seekg(O) ; cout endl ? ; cin request;

cout << Конец счета. endl; return 0;

void outputLine(int acct, char *name, float bal) {

cout setiosflags(ios::left) setw(lO) << acct

setw(13) name setw(7) setprecision(2) << setiosflags(ios::showpoint ios::right) bal endl;

Рис. 14.8. Программа запроса кредитной информации (часть 2 из 2)

14.6. Обновление файлов последовательного доступа

Данные, которые форматируются и записываются файл последовательного доступа, как показано в разделе 14.4, не могут быть модифицированы без риска разрушения других данных в файле. Например, если имя White требуется заменить на Worthington , то прежнее имя не может быть просто перезаписано. Запись для White была помещена в файл как

300 White 0.00

Если эта запись перезаписывается начиная с той же самой позиции в файле, но имеет более длинное имя, то новая запись принимает вид:

300 Worthington 0.00



Счета с нулевым балансом: 300 White 0.00

Счета с кредитным бгшансом: 400 Stone -42.16

Счета с дебетовым сальдо: 100 Jones 24.98

200 Doe 345.67

500 Rich 224.62

Конец счета.

Рис. 14.9. Пример вывода программы запроса кредитной информации на рис. 14.8

Такое обновление может быть реализовано, но оно затруднено. Например, для того, чтобы изменить предыдущее имя, следует записи до 300 White 0.00 в файле последовательного доступа скопировать в новый файл, затем записать в этот новый файл обновленную запись, а затем скопированы в новый файл записи после 300 White 0.00. Это требует обработки всех записей в файле при обновлении одной записи. Такой метод может быть приемлемым только в случае обновления в одном проходе многиз записей.

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

До сих пор мы рассказывали, как создавать файлы последовательного доступа и определять с их помощью местоположение требуемой информа-

Новая запись содержит на шесть символов больше, чем первоначальная запись. Следовательно, символы после второго символа о в имени Worthington будут записаны поверх начала следующей записи в файле. Проблема в том, что в модели форматированного ввода-вывода, используемой операциями поместить в поток и извлечь из потока , поля и, следовательно, записи могут быть различных размеров. Например, 7, 14, -117, 2074 и 27383 - все эти числа являются целыми типа int, и каждое из них в сыром виде хранится в одинаковом количестве байтов, но когда эти целые числа выводятся как форматированный текст на экран или в файл на диске, то они занимают поля разных размеров. Следовательно, модель форматированного ввода-вывода обычно не применима для обновления записей на месте.

Запрос на ввод

1 - Список счетов с нулевым балансом

2 - Список счетов с кредитным балансом

3 - Список счетов с дебетовым сальдо

4 - Конец счета



ции. Файлы последовательного доступа являются неподходящими для приложений с так называемым немедленным доступом*, в которых конкретная запись информации должна быть локализована немедленно. Такими распространенными приложениями с немедленным доступом являются, например, системы резервирования авиабилетов, банковские системы, система терминалов для производства платежей в месте совершения покупок, банковские автоматы и другие типы систем по обработке запросов, которые требуют оперативного доступа к конкретным данным. Банк, в котором у вас имеется счет, может иметь сотни тысяч или даже миллионы клиентов, и тем не менее, когда вы пользуетесь банковским автоматом, ваш счет проверяется на наличие достаточных средств в течение нескольких секунд. Этот тип немедленного доступа становится возможным с помощью файлов произвольного доступа. Отдельные записи файла произвольного доступа могут быть доступны непосредственно (и быстро) без поиска среди других записей.

Как уже было сказано, С-Ь-Ь не налагает требований на структуру файлов. Так что приложение, в котором предполагается использовать файлы произвольного доступа, должно буквально создать их. Для создания файлов произвольного доступа может быть использовано множество методов. Может быть наиболее простым из них является требование, чтобы все записи в файле были одинаковой фиксированной длины.

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

Рис. 14.10 демонстрирует представление в С-Н- файла произвольного доступа, образованного из записей фиксированной длины (длина каждой записи 100 байт). Файл произвольного доступа подобен железнодорожному поезду со многими вагонами, одни из которых заняты, а другие свободны.

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

100 100

байфоа байтов

100 бамтоа

100 100

байтов байфоа

100 баЙФов

Рис. 14.10. Представление файла произвольного доступа на языке С++



1 ... 248 249 250 [ 251 ] 252 253 254 ... 342

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