|
Программирование >> Структурное программирование
ifstream inClientFile( clients.dat , ios::in); if (! inClientFile) { cerr << Файл не может быть открыт endl; exit (1); int account; char name[10] ; float balance; cout setiosflags(ios::left) setw(10) Счет setw(13) Имя Баланс endl; while (inClientFile account >> name >> balance) outputLine(account, name, balance); return 0; void outputLine(int acct, char *name, float bal) { cout << setiosflags(ios::left) <<setw(10) << acct setw(13) name setw(7) setprecision (2) setiosflags(ios::showpoint ios::right) bal endl; Счет Имя Баланс 100 Jones 24.98 200 Doe 345.67 300 White 0.00 400 Stone -42.16 500 Rich 224.62 Рис. 14.7. Чтение и печать последовательного файла читает из файла набор данных (т.е. запись). После первого выполнения этого оператора переменная account имеет значение 100, переменная name имеет значение JONES , а переменная balance - значение 24.98. Всякий раз, когда выполняется приведенный оператор, в переменные account, name и balance считывается следующая запись из файла. Записи выводятся на экран с помощью функции outputLine, которая использует параметризованные манипуляторы потока для форматирования данных, изображаемых на экране. Когда достигается конец файла, входная последовательность в операторе wliile возвращает О (а обычно возвращается поток inClientFile), файл закрывается с помощью деструктора класса ifstream и программа завершается. figl4 7.cpp Чтение и печать последовательного файла #include <iostream.h> tinclude <fstream.h> tinclude < iomanip.h> tinclude <stdlib.h> void outputLine(int, char*, float); main () { Для последовательного поиска данных в файле программа обычно начинает чтение данные с начала файла и читает все данные последовательно до тех пор, пока не будут найдены требуемые данные. Это может привести к необходимости обрабатывать файл последовательно несколько раз в течение выполнения программы (каждый раз с начала файла). Как класс istream, так и класс ostream содержат функции-элементы для позиционирования указателя позиции файла (это порядковый номер следующего байта в файле, который должен быть считан или записан). Этими функциями-элементами являются seekg (позиционировать для извлечения из потока) для класса istream и seekp (позиционировать для помещения в поток) для класса ostream. Любой объект класса istream имеет так называемый указатель get , который показывает номер в файле очередного вводимого байта; а любой объект класса ostream имеет указатель set , который показывает номер в файле очередного выводимого байта. Оператор inClientFile.seekg(0); позиционирует указатель позиции файла на начало файла (позиция 0), присоединенного к inClientFile. Аргумент функции seekg обычно является целым типа long. Второй аргумент, который может быть задан, показывает так называемое направление позиционирования. Направление позиционирования может быть ios::beg (по умолчанию) для позиционирования относительно начала потока, ios::cur - для позиционирования относительно текущей позиции в потоке и ios::end - для позиционирования относительно конца потока. Указатель позиции файла является целым числом, которое устанавливает позицию в файле как число байтов от начальной позиции в файле (иногда это называют смещением от начала файла). Приведем несколько примеров позиционирования указателя позиции в файле для извлечения из потока: Позиционирование fileObject на п-ый байт полагаем ios::beg fileObject.seekg(n) ; Позиционирование fileObject на n байтов вперед fileObject.seekg(n, ios::cur); Позиционирование fileObject на у-ый байт от конца файла fileObject.seekg(у, ios::end); Позиционирование fileObject на конец файла fileObject.seekg (О, ios::end); Те же самые операции могут быть выполнены с помощью функции-элемента seekg класса ostream. Функции-элементы tellg и tellp возвращают текущие позиции соответственно указателя взять из потока get и указателя поместить в поток set . Следующий оператор присваивает переменной location типа long значение указателя get . location = fileObject.tellgО; Программа на рис. 14.8 позволяет менеджеру по кредитам отображать на экране информацию для клиентов с нулевым балансом (т.е. клиентов, у которых нет перед компанией задолженности), информацию по кредитному балансу (т.е. клиентов, которым должна компания) и информацию по дебетовому сальдо (т.е. клиентов, у которых имеется задолженность перед компанией за товары и услуги, полученные в прошлом). Программа отображает меню и позволяет менеджеру по кредитам вводить одну из трех опций получения соответствующей информации по кредитам. Опция 1 выводит список счетов с нулевым балансом. Опция 2 выводит список счетов с кредитным балансом. Опция 3 выводит список счетов с дебетовым сальдо. Опция 4 завершает выполнение программы. Пример вывода приведен на рис. 14.9. figl4 8.cpp Программа запроса кредитной информации tinclude <iostream.h> tinclude <fstream.h> tinclude <iomanip.h> tinclude <stdlib.h> void outputLine(int, char*, float); main ( ) { ifstream inClientFile ( clients.dat , ios:: in); if (! inClientFile) { cerr << Файл не может быть открыт endl; exit (1); cout << Запрос на ввод endl 1 - Список счетов с нулевым балансом endl 2 - Список счетов в кредитным балансом << endl << 3 - Список счетов с дебетовым сальдо << endl 4 - Конец счета endl ? ; int request; cin >> request; while (request != 4) { int account; char name[10]; float balance; inClientFile >> account >>name balance; switch (request) { case 1: cout endl Счета с нулевым балансом: endl; while (! inClientFile.eofО) { if (balance == 0) outputLine(account, name, balance); inClientFile account name balance; brealc; Рис. 14.8. Программа запроса кредитной информации (часть 1 из 2)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |