|
Программирование >> Разработка устойчивых систем
Манипуляторы Как видно из предыдущего примера, частые вызовы функций потоковых классов при форматировании несколько утомительны. Чтобы программы было проще читать и писать, были определены специальные манипуляторы, которые дублируют некоторые функции потоковых классов. Манипулятор - не более чем удобство, избавляющее вас от необходимости специально вызывать функцию. Манипуляторы изменяют состояние потока вместо обработки данных (или наряду с ней). Например, при вставке манипулятора endl в команду вывода он не только выводит символ новой строки, но и сбрасывает поток (то есть выводит все символы, которые хранились во внутреннем буфере потока, но еще не были непосредственно выведены). Поток можно сбросить и другим способом: cout flush: Это приводит к вызову функции flush о без вывода новых данных в поток: cout.flushO: Другие манипуляторы позволяют быстро переключиться на восьмеричную (oct), десятичную (dec) или шестнадцатеричную (hex) систему счисления: cout hex Ox i endl; В данном случае весь вывод будет осуществляться в шестнадцатеричной системе до тех пор, пока в выходной поток не будет вставлен манипулятор dec или oct. Существует и манипулятор для чтения, поглощающий пропуски во входном потоке: cin WS: Манипуляторы без аргументов предоставляются заголовочным файлом <iostream>. К их числу относятся dec, oct и hex, делающие то же самое, что и, соответственно, setf(ios::dec,ios::basefield), setf(ios::oct,ios::basefield) и setf(ios::hex,ios::basefield), хотя и в более компактной записи. Кроме того, заголовок <iostream> содержит манипуляторы WS, endl и flush, а также дополнительные манипуляторы, перечисленные далее. showbase/noshowbase Вывод признака системы счисления (dec, oct или hex) при выводе целочисленных величин. showpos/noshowpos Отображение знака плюс (+) для положительных величин. uppercase/nouppercase Вывод в верхнем регистре букв A-F в шестнадцатеричных числах и буквы Е в экспоненциальной записи. showpoi nt/noshowpoi nt Отображение десятичной точки и завершающих нулей в вещественных числах. T.width(40): Is there any more?0000000000000000000000 Анализ этих данных поможет разобраться в том, как работают функции форматирования потоковых классов. Манипуляторы с аргументами Шесть стандартных манипуляторов, определяемых в заголовочном файле <iomanip>, получают аргументы. Краткое описание этих манипуляторов приводится ниже. setiosflags(fmtflags n) Эквивалент вызова setf(n). Продолжает действовать до следующего изменения флагов (например, вызовом ios::setf()). resetiosflags(fmtflags n) Сброс флагов, включенных в п. Продолжает действовать до следующего изменения флагов (например, вызовом ios::unsetf()). setbase(base n) Переход на систему счисления с основанием п, равным 8,10 или 16 (при любом другом значении используется 0). Если п=0, вывод осуществляется в десятичной системе, но при вводе используются правила С: 10 интерпретируется как 10, 010 - как 8, а Oxf - как 16. С таким же успехом для вывода можно применять манипулятор dec, oct или hex. setfilKchar n) Выбор заполнителя n, как при вызове ios::fiU(). setprecisionCint n) Выбор точности п, как при вызове ios::precision(). setw(int n) Выбор щирины ПОЛЯ п, как при вызове ios::width(). Если вам приходится выполнять многочисленные операции форматирования, переход от функций потоковых icnaccoB к манипуляторам сделает программу более четкой и понятной. Для примера рассмотрим программу из предыдущего раздела, переписанную с применением манипуляторов (макрос D() удален, чтобы программа проще читалась). : C04:Manips.cpp Программа format.срр с манипуляторами linclude <fstream> linclude <iomanip> linclude <iostream> skipws/noskipws Игнорирование пропусков (при вводе; используется по умолчанию), left Выравнивание по левому краю (дополнение справа), right Выравнивание по правому краю (дополнение слева). internal Заполнение между знаком (или признаком системы счисления) и значением. scientific/fixed Тип записи вещественных чисел (научная или с фиксированной точностью). using namespace std; int mainO { ofstream trc( trace.out ); int i = 47; float f = 2300114.414159; char* s = Is there any more? ; trc setiosflagsdos; :unitbuf I ios;:showbase ios::uppercase I ios::showpos); trc i endl; trc hex i endl oct i endl; trc.setf(ios:;left. ios::adjustfield): trc resetiosflagsdos: :showbase) dec setfi11(0); trc fill char: trc.fillO endl; trc setw(lO) i endl; trc.setf(ios::right. ios::adjustfield); trc setw(lO) i endl; trc.setfdos::internal. ios: :adjustfield); trc setw(lO) i endl: trc i endl: Без setw(lO) trc resetiosflagsdos: :showpos) setiosflags(iOS;:showpoint) prec = trc.precisionO endl: trc.setf(ios::scientific, ios::floatfield): trc f resetiosflagsOos: :uppercase) endl: trc.setfOos; ;fixed. ios: :floatfield): trc f endl; trc f endl: trc setprecision(20): trc prec = trc.precisionO endl; trc f endl; trc.setf(ios::scientific, ios::floatfield): trc f endl: trc.setf(ios::fixed, ios::floatfield); trc f endl; trc f endl; trc setw(lO) s endl: trc setw(40) s endl: trc.setfOos: :left. ios: :adjustfield); trc setw(40) s endl: } III:- Группы отдельных команд были объединены в одну цепочечную операцию вывода. Обратите внимание на вызов setiosflags() с передачей поразрядной дизъюнкции флагов. То же самое можно было сделать функциями setf() и unsetf(), как в предыдущем примере. При вызове setw() с потоком вывода выводимое выражение форматируется во временную строку и при необходимости дополняется текущим заполнителем до нужной ширины, для чего длина отформатированного результата сравнивается с аргументом setw(). Другими словами, setwQ влияет на итоговую строку операции форматированного вывода. С другой стороны, применение setwQ к потокам ввода имеет смысл лишь при чтении строк. В этом нетрудно убедиться на следующем примере:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |