|
Программирование >> Структурное программирование
14.8. Создание файла произвольного доступа Функция-элемент write класса ostream выводит фиксированное число байтов, начиная от заданного места в памяти, в заданный поток. Когда поток связан с файлом, данные пишутся, начиная с позиции в файле, определяемой при помощи указателя позиции файла put . Функция-элемент read класса istream вводит фиксированное число байтов из заданного потока в область памяти, начиная с указанного адреса. Если поток связан с файлом, байты вводятся начиная с позиции в файле, определенной при помощи указателя позиции файла get . Теперь при записи в файл переменной целого типа number вместо использования оператора outFile number; который может напечатать для 4-байтовой целой переменной от 1 до 11 символов (до 10 разрядов плюс знак, каждый из которых требует 1 байта памяти), можно использовать оператор outFile . write ( (char *) snumber, sizeof (ntimber) ) ; который всегда записывает 4 байта (на компьютере с 4-байтовыми целыми). Функция write ожидает первый аргумент типа char * и поэтому мы использовали приведение к типу (char *). Второй аргумент функции write является целым типа size t и определяет число байтов, которые должны быть записаны. Как будет видно в дальнейшем, функция read класса istream может быть использована для последующего чтения 4 байтов обратно в переменную целого типа number. Программа обработки файла произвольного доступа в редких случаях записывает единственное поле в файл. Обычно программы записывают за раз по одному объекту типа struct или class, как показано в примерах, приведенных ниже. Рассмотрим постановку следующей задачи: Создайте программу по обработке счетов по кредитам, способную хранить до 100 записей фиксированной длины, для компании, которая может иметь до 100 клиентов. Каждая запись должна состоять из номера счета, который будет использован в качестве ключа записи, фамилии и имени клиента и его баланса. Программа должна быть способна обновлять счет, вставлять новый счет, уничтожать счет и выводить список всех записей по счетам в форматированный текстовый файл для их последующей печати. Следующие несколько разделов знакомят с методами, необходимыми для создания данной программы по обработке счетов по кредитам. Рис. 14.11 демонстрирует открытие файла произвольного доступа, описание формата записи с помощью struct и запись данных на диск. Эта программа задает начальные значения всем 100 записям файла credit.dat в виде незаполненных записей типа struct, используя функцию write. Каждая незаполненная запись типа struct содержит номер счета О, нулевую строку (представляемую при помощи пустых кавычек) в качестве фамилии и имени и 0.0 в качестве баланса. В файл первоначально записано столько незаполненных записей, сколько счетов предполагается хранить, для того, чтобы в дальнейшем программа могла определять, содержит ли любая запись данные, или она является незаполненной. 14.9. Произвольная запись данных в файл произвольного доступа Программа, приведенная на рис. 14.12, записывает данные в файл credit.dat . Она использует комбинацию функций seekp и write класса ostream для сохранения данных в точно определенном месте в файле. Функция seekp устанавливает указатель файла put в заданную позицию в файле, а затем функция write выводит данные. Пример выполнения показан на рис. 14.13. Оператор outCredit.seekp((client.acctNum - 1) * sizeof(client)); figl4 ll.cpp Последовательность создания файла произвольного доступа #include <iostreain. h> iinclude <fstream.h> iinclude <stdlib.h> struct clientData { int acctNum; char lastName[15]; char firstName[10]; float balance; main ( ) { ofstream outCredit{ credit. dat , ios::out); if (! outCredit) { cerr Файл не может быть открыт. << endl; exit (1) ; clientData blankClient = {0, , , 0.0); for (int 1=1; i <=100; i++) outCredit.write((char *)SblankClient, sizeof(blankClient)); return 0; Рис. 14.11. Последовательность создания файла произвольного доступа На рис. 14.11 оператор outCredit.write((char *) SblankClient, sizeof(blankClient)); вызывает структуру blankClient размером sizeof (blankClient), чтобы осуществить запись в файл credit.dat, связанный с объектом outCredit класса ofstream. Вспомним, что оператор sizeof возвращает размер в байтах объекта, заключенного в скобки (см. главу 5). figl4 12.cpp Запись в файл произвольного доступа ttinclude <iostream.h> iinclude <fstream.h> iinclude <stdlib.h> struct clientData { int acctNum; char lastName[15]; char firstName[10]; float balance; main () { ofstream outCredit( credit.dat , ios::ate); if (! outCredit) { cerr << Файл не может быть открыт. <<endl; exit(1); cout << Введите номер счета (от 1 до 100, О - конец ввода) << endl ? ; clientData client; cin >> client.acctNum; while (client.acctNum > 0 && client.acctNum <= 100){ cout Введиою фамилию, имя, баланс endl ? ; cin >> client.lastName >> client.firstName client.balance; outCredit.seekp((client.acctNum - 1) * sizeof(client)); outCredit.write((char *)&client, sizeof(client)); cout << Введите номер счета << endl ? ; cin client.acctNum; return 0; } Рис. 14.12. Произвольная запись данных в файл произвольного доступа устанавливает указатель файла put для объекта outCredit в позицию байта, вычисленного посредством (client.acctNum - 1) * sizeof(client). Поскольку номер счета лежит в пределах от 1 до 100, то при определении позиции записи из номера счета вычитается 1. Таким образом, для записи 1 указатель позиции файла устанавливается на байт файла 0. Отметим, что объект outCredit класса ofstream открывается в режиме открытия файла ios::ate. Указатель позиции файла put первоначально устанавливается на конец файла, но данные могут быть записаны в любое место в файле.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |