|
Программирование >> Инициализация объектов класса, структура
#include <iostream> #include <sstream> int main() int ival = 1024; int *pival = &ival; double dval = 3.14159; double *pdval = &dval; ostringstream format message; преобразование значений в строковое представление format message << ival: << ival << адрес ival: << pival << n << dval: << dval << адрес dval: << pdval << endl; string msg = format message.str(); cout << размер строки сообщения: << msg.size() << сообщение: << msg << endl; Иногда лучше собрать все диагностические сообщения об ошибках, а не выводить их по мере возникновения. Это легко сделать с помощью перегруженного множества функций string format( string msg, int expected, int received ) { ostringstream message; message << msg << ожидалось: << expected << принято: << received << \n ; return message.str(); string format( string msg, vector<int> *values ); форматирования: ... и так далее Приложение может сохранить такие строки для последующего отображения и даже рассортировать их но серьезности. Обобщить эту идею помогают классы Notify (извещение), Log (протокол) и Error (ошибка). Поток istringstream читает из объекта класса string, с помощью которого был сконструирован. В частности, он применяется для преобразования строкового представления числа в его арифметическое значение: #include <iostream> #include <sstream> #include <string> int main() { int ival = 1024; int *pival = &ival; double dval = 3.14159; double *pdval = &dval; создает строку, в которой значения разделены пробелами ostringstream format string; format string << ival << << pival << << dval << << pdval << endl; извлекает сохраненнхе значения в коде ASCII и помещает их в чете разн объекта istringstream input istring( format string.str() ); input istring >> ival >> pival >> dval >> pdval; Упражнение 20.16 В языке Си форматирование выходного сообщения производится с помощью функций int ival = 1024; double dval = 3.14159; char cval = a; char *sval = the char *sval = the end ; printf( ival: %d\tdval% %g\tcval: %c\tsval: %s , семейства printf() . Например, следующий фрагмент ival, dval, cval, sval ); печатает: ival: 1024 dval: 3.14159 cval: a sval: the end Первым аргументом printf() является форматная строка. Кажд1й символ % показывает, что вместо него должно быть подставлено значение аргумента, а следующий за ним символ определяет тип этого аргумента. Вот некоторые из поддерживаемых типов %d целое число %g число с плавающей точкой %c char (полное описание см. в [KERNIGHAN88]): %s C-строка Дополнительные аргументы printf() на позиционной основе сопоставляются со спецификаторами формата, начинающимися со знака %. Все остальные символы в форматной строке рассматриваются как литералы и выводятся буквально. Основные недостатки семейства функций printf() таковы: во-первых, форматная строка не обобщается на определенные пользователем типы, и, во-вторых, если типы или число аргументов не соответствуют форматной строке, компилятор не заметит ошибки, а вывод будет отформатирован неверно. Однако у функций printf() есть и достоинство -компактность записи. 1. Получите так же отформатированный результат с помощью объекта класса ostringstream. 2. Сформулируйте достоинства и недостатки обоих подходов. 20.9. Состояние формата Кажд1й объект класса из библиотеки iostream поддерживает состояние формата, которое управляет выполнением операций форматирования, например основание системы счисления для целых значений или точность для значений с плавающей точкой. Для модификации состояния формата объекта в распоряжении программиста имеется нредонределенн1й набор Манипуляторов].1 М анинулятор при Меня ется к нотоковому объекту так же, как к данн1м. Однако вместо чтения или записи данных манипулятор модифицирует внутреннее состояние потока. Например, по умолчанию объект типа bool, Примечание [O.A.6]: Нумера ция сносок сбита. #include <iostream.h> int main() { bool illustrate = true; cout << объект illustrate типа bool установлен в true: << illustrate << \n; имеющий значение true (а также литеральная константа true), выводится как целая 1: Чтобы поток cout выводил переменную illustrate в виде слова true, мы применяем манипулятор boolalpha: 1 Кроме того, программист может устанавливать и сбрасывать флаги состояния формата с помощью функций-членов setf () и unsetf (). Мы их рассматривать не будем; исчерпывающие ответы на вопросы, относящиеся к этой теме, можно получить в [STROUSTRUP97].
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |