|
Программирование >> Структурное программирование
updateFile.seekg((account - 1) * sizeof(client)); clientData client; updateFile.read((char *)sclient, sizeof(client)); if (client.acctNum != 0) { outputLine(cout, client); cout << endl << Введите расход (+) или доплату (-) float transaction; cin >> transaction; client.balance += transaction; outputLine(cout, client); updateFile.seekp((account - 1) * sizeof (client)); updateFile.write((char *)Sclient, sizeof(client)); else cerr << Счет № << account не заполнен. endl; Создание и вставка новой записи void newRecord(fstream SinsertlnFile) { cout << Введите новый номер счета (1 - 100): ; int account; cin >> account; insertlnFile.seekg((account - 1) + sizeof(client)); clientData client; insertlnFile.read((char *)Sclient, sizeof (client)); if (client.acctNum == 0) { cout << Введите фамилию, имя, баланс <<endl << ? ; cin >> client.lastName >> client.firstName >> client.balanc; client.acctNum = account; insertlnFile.seekp((account - 1) * sizeof(clientData)); insertlnFile.write((char *)sclient, sizeof(clientData)); else cerr Счет № account << уже содержит информацию. << endl; Удаление существующей записи void deleteRecord(fstream SdeleteFromFile) cout << Введите номер счета для удаления (1 - 100): ; int account; cin >> account; deleteFromFile.seekg((account - 1) * sizeof(client)); ClientData client; deleteFromFile.read((char *)sclient, sizeof(client)); Рис. 14.15. Программа банковских счетов (чааь 4 из 5) if (client.acctNum != 0) { ClientData blankClient = (О, , , 0); deleteFromFile.seekp((account - 1) * sizeof(client)); deleteFromFile-write((char *)SblankClient, sizeof(client)); cout << Счет № account << удален. endl; else cout Счет № account пустой. << endl; Вывод строки с информацией о клиенте void outputLine(ostream soutput, clientData с) ( output setiosflags(ios::left) setw(6) c.acctNum setw(16) c.lastName setw(ll) c.firstName << setiosflags(ios::showpoint I ios::right) setw(10) setprecision(2) c.balance endl; Рис. 14.15. Программа банковских счетов (часть 5 из 5) 14.12. Обработка потоков строк в дополнение к стандартному потоку ввода-вывода и файловому потоку ввода-вывода в С++ имеется возможность для ввода из символьных массивов в память и вывода в символьный массив из памяти. Эта возможностям часто называется форматированным вводом-выводом в память или обработкой потоков строк. Ввод символьного массива поддерживается при помощи класса istrstream. Вывод в символьный массив поддерживается с помощью класса ostrstream. Класс istrstream наследует функциональные возможности класса istream. Класс ostrstream наследует функциональные возможности класса ostream. Программы, которые используют форматированный ввод-вывод в память, должны включать заголовочные файлы <strstream.h> и <iostream.h>. Одним из применений этих методов является проверка достоверности данных. Программа может читать строку целиком из входного потока в массив символов. Затем может подключаться процедура, проверяющая достоверность данных, корректирующая (или восстанавливающая) их, если это необходимо. А затем программа может обрабатывать вводимые из символьного массива данные, зная, что все они соответствующим образом отформатированы. Вывод в символьный массив является прекрасным способом использования мощных возможностей форматирования потоков в С++. Данные могут быть подготовлены в символьном массиве, имитирующем формат экранного редактора. Такой массив может быть записан в файл на диск для сохранения изображения экрана. Объект ostrstream может использоваться двумя способами. Первый способ использует динамически размещаемый символьный массив вывода, который пересылается в объект ostrstream. Как только вывод завершен, объект может быть заморожен функцией-элементом str, чтобы в дальнейшем для вывода не надо было делать пересылок в этот объект. Функция-элемент str возвращает указатель типа char * на начало объекта массива в памяти. Этому указателю можно присвоить значение переменной типа char * и ссылаться на него как на любой символьный массив в С++. Рис. 14.16 демонстрирует динамически размещаемый объект ostrstream. Программа создает объект outputString класса ostream и использует операцию поместить в поток для вывода набора строк и численных значений в объект. Манипулятор потока ends помещает нулевой символ (\0) в конце вывода данных в outputString. Затем программа замораживает содержимое потока outputString функцией-элементом str и присваивает переменной указателю result указатель на начало массива в памяти. Далее массив выводится в виде строки. Программа проверяет состояние потока outputString перед тем, как поместить в него информациюю После того, как функция-элемент str вызвана, предпринимается следующая попытка поместить в поток. Второй способ использования объекта класса ostrstream - передача ему трех аргументов для конструктора класса ostrstream: символьного массива, его длины и режима открытия потока (ios::out или ios::app). Если задан режим ios::app, то символьный массив воспринимается как строка, заканчивающаяся нулевым символом, и информация помещается, начиная с позиции этого нулевого символа. figl4 16.cpp Использование динамически размещаемого объекта класса ostrstream. iinclude <iostream.h> iinclude <strstream.h> main() { ostrstream outputString; char *sl = Вывод нескольких типов данных , *s2 = в объект класса ostrstream: , *s3 = \n double: , *s4 = \n int: , *s5 = Хпадрес int: , ♦result; double d = 123.4567; int i = 22; cout Состояние потока outputString << перед помещением в него данных: outputString.rdstate() << endl; outputString << si s2 s3 d s4 i s5 &i ends; result = outputString.str0; outputString ПРОВЕРКА ПОМЕЩЕНИЯ В ПОТОК ПОСЛЕ ВЫЗОВА str ; cout << endl Состояние outputString после вызова str endl << и следующей попытки помещения данных в поток: outputString.rdstate() endl endl Динамически созданная строка содержит: << endl endl result endl; return 0; } Рис. 14.16. Использование динамически размещаемого объекта класса ostrstream (часть 1 из 2)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |