Программирование >>  Разработка устойчивых систем 

1 ... 43 44 45 [ 46 ] 47 48 49 ... 196


Манипуляторы

Как видно из предыдущего примера, частые вызовы функций потоковых классов при форматировании несколько утомительны. Чтобы программы было проще читать и писать, были определены специальные манипуляторы, которые дублируют некоторые функции потоковых классов. Манипулятор - не более чем удобство, избавляющее вас от необходимости специально вызывать функцию.

Манипуляторы изменяют состояние потока вместо обработки данных (или наряду с ней). Например, при вставке манипулятора 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 к потокам ввода имеет смысл лишь при чтении строк. В этом нетрудно убедиться на следующем примере:



1 ... 43 44 45 [ 46 ] 47 48 49 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика