|
Программирование >> Разработка устойчивых систем
fmtflags ios: fmtflags ios: fmtflags ios: fmtflags ios: flags(fmtflags newflags): setf(fmtflags ored flag): unsetf(fmtflags clear flag): setf(fmtflags bits, fmtflags field): Первая функция изменяет все флаги. Иногда именно это и нужно, но чаще требуется изменить состояние одного отдельного флага. Эта задача осуществляется тремя оставшимися функциями. Функция setf() нередко вызывает недоразумения. Чтобы выбрать одну из ее перегруженных версий, нужно знать тип изменяемого флага. Существуют два типа флагов: одни устанавливаются или сбрасываются независимо, а вторые работают в сочетании с другими флагами. С независимыми флагами все просто: они устанавливаются функцией set(fmtflags) и сбрасываются функцией unset(fmtflags). Эти флаги перечислены ниже, ios::skipws Игнорирование пропусков (при вводе; используется по умолчанию). ios::showbase Вывод признака системы счисления (dec, oct или hex) при выводе целочисленных величин. Входные потоки также распознают префикс системы счисления при установленном флаге showbase. для потоков доступны все функции форматирования вывода, и это позволяет вам форматировать свой набор байтов так, как вы сочтете нужным. При первом знакомстве с форматными функциями потоков ввода-вывода часто возникает путаница, так как во многих случаях форматированием можно управлять разными способами: при помощи функций класса и манипуляторов. Ситуация дополнительно осложняется тем, что обобщенные функции классов управляют форматированием при помощи флагов (например, флага выравнивания по левому или правому краю, флага использования прописных букв в шестна-дцатеричной записи, флага обязательного включения десятичной точки в вещественные числа и т. д.). С другой стороны, чтение и запись символа-заполнителя, ширины поля и точности осуществляются отдельными функциями потоковых классов. Чтобы прояснить эту запутанную ситуацию, мы сначала рассмотрим внутреннее форматирование данных в потоках и функции потоковых классов, изменяющие состояние этих данных. Манипуляторы будут рассматриваться отдельно. Форматные флаги Класс ios содержит переменные для хранения всех форматных данных, относящихся к потоку. Некоторые из этих данных принимают значения в допустимых интервалах (точность вещественных чисел, ширина поля и символ, используемый для заполнения пустых позиций при выводе; обычно это пробел). Остальные атрибуты форматирования определяются флагами, которые обычно объединяются для экономии места; в совокупности они называются форматными флагами. Значения форматных флагов можно получить функцией ios::flags() потокового класса. Функция вызывается без аргументов и возвращает объект типа fmtflags (обычно это синоним для типа long) с текущими форматными флагами. Другие функции изменяют состояние форматных флагов и возвращают их предыдущий набор: ios::Showpo1nt Отображение десятичной точки и завершающих нулей в вещественных числах. 1os::uppercase Вывод в верхнем регистре букв A-F в шестнадцатеричных числах и буквы Е в экспоненциальной записи. 1 OS::Showpos Отображение знака плюс (+) для положительных величин. ios::un1tbuf После каждой операции записи данные немедленно передаются в выходной поток. Например, вывод знака плюс в положительных числах для cout включается вызовом функции cout.setf(ios::showpos). Чтобы отказаться от дальнейшего вывода знака плюс, вызовите функцию cout.unsetf(ios::showpos). Флаг unitbuf устанавливает режим немедленного вывода, при котором каждая операция записи немедленно актуализируется в своем выходном потоке. Он особенно удобен при трассировке ошибок, чтобы при аварийном завершении программы данные все равно были записаны в файл журнала. Следующая программа демонстрирует немедленный вывод: : С04:Unitbuf.срр linclude <cstdlib> Для abortO linclude <fstreani> using namespace std: int mainO { ofstream outClog.txt ): out.setf(ios::unitbuf): out one\n : out two\n ; abortO: } /:- Режим немедленного вывода должен быть включен до первой операции записи в поток. Когда мы закомментировали вызов setf(), один из компиляторов записал в файл log.txt только букву о . Установка флага предотвратила потерю данных. Немедленный вывод включен по умолчанию для стандартного потока вывода ошибок cerr. С другой стороны, отказ от промежуточной буферизации снижает эффективность вывода, поэтому при интенсивном использовании потока вывода не стоит включать режим немедленного вывода (если вас хоть сколько-нибудь беспокоят проблемы буферизации). Форматные поля Форматные флаги второго типа используются в группах. В любой момент времени может быть установлен только один флаг в группе, вроде кнопок в старых автомобильных радиоприемниках - если нажать одну кнопку, остальные кнопки автоматически сбрасываются. К сожалению, у форматных флагов автоматический сброс не работает, и вы должны следить за тем, какие флаги устанавливаются, чтобы по ошибке не вызвать функцию setf() с неверным набором флагов. Например, существуют флаги для трех систем счисления: шестнадцатеричной, десятичной Переменные width, fill и precision Значения внутренних переменных, управляющих шириной поля, символом-заполнителем и точностью вещественных чисел, читаются и задаются одноименными функциями потоковых icnaccoB, и восьмеричной. В совокупности эти флаги обозначаются ios::basefield. Если флаг ios::dec установлен и вы вызываете функцию setf(ios::hex), то флагю5::Ьех устанавливается, однако флаг ios::dec при этом не сбрасывается, что приводит к непредсказуемым последствиям. Вместо этого следует вызвать вторую форму функции setf() вида setf(ios::hex,ios::basefield). Этот вызов сначала сбрасывает все флаги группы ios::basefield, а затем устанавливает ios:: hex. Таким образом, данная форма setf() гарантирует, что при установке одного флага остальные флаги соответствующей группы будут сброшены. Манипулятор ios::hex делает это автоматически, поэтому вам не придется разбираться во внутренних подробностях реализации этого класса и вообще знать, что система счисления определяется набором двоичных флагов. Позднее вы убедитесь, что функциональность setf() всегда обеспечивается эквивалентными манипуляторами. Ниже перечислены группы флагов и эффект от их установки. Флаги группы ios::basefield: ios::dec Целочисленные значения форматируются в десятичной системе счисления (используется по умолчанию, префикс не нужен). ios::hex Целочисленные значения форматируются в шестнадцатеричной системе счисления. ios::OCt Целочисленные значения форматируются в восьмеричной системе счисления. Флаги группы ios::floatfield (если ни один флаг не установлен, ее количество значащих цифр определяется полем precision): ios::scientific Вещественные числа отображаются в научной (экспоненциальной) записи. Количество цифр в дробной части определяется полем precision. ios::fixed Вещественные числа отображаются в формате с фиксированной точностью. Количество цифр в дробной части определяется полем precision. Флаги группы ios::adjustfield: ios:: left Вещественные числа отображаются в научной (экспоненциальной) записи. Количество цифр в дробной части определяется полем precision. ios::right Вещественные числа отображаются в формате с фиксированной точностью. Количество цифр в дробной части определяется полем precision. ios::internal Общее количество значащих цифр определяется полем precision.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |