|
Программирование >> Операторы преобразования типа
Ширина поля, заполнитель, выравнивание Функции widthO и flll() определяют ширину поля и заполнитель (табл. 13.13). Таблица 13.13. Функции для работы с шириной поля и заполнителем Функция Описание width() Возвращает текущую ширину поля width(val) Задает ширину поля равной val и возвращает предыдущую ширину поля fill() Возвращает текущий заполнитель flll(c) Назначает новый и возвращает предыдущий заполнитель Использование при выводе ширины поля, заполнителя и выравнивания при выводе функция width() определяет минимальную ширину поля. Определение относится только к следующему выводимому форматированному полю. При вызове без аргументов width() возвращает текущую ширину поля. При вызове с целочисленным аргументом функция width() изменяет ширину поля и возвращает ее предыдущее значение. По умолчанию минимальная ширина равна 0; это означает, что размер поля может быть произвольным. Такое значение устанавливается после вывода. Ширина поля не может использоваться для сокращения вывода. То есть максимальную ширину поля задать невозможно. Вместо этого ее придется самостоятельно запрограммировать, например, записав данные в строку и ограничив вывод определенным количеством символов. Функция fill() определяет символ, используемый для заполнения промежутков между отформатированным представлением величины и позицией, отмечающей минимальную ширину поля. По умолчанию заполнителем является пробел. Тип выравнивания данных внутри поля определяется тремя флагами, перечисленными в табл. 13.14. Эти флаги определяются в классе ios base вместе с соответствующей маской. Таблица 13.14. Флаги типа выравнивания Маска Флаг Описание adjustfield left Выравнивание по левому краю right Выравнивание по правому краю Internal Выравнивание знака по левому краю, а значения - по правому краю нет Выравнивание по правому краю (по умолчанию) После выполнения любой операции форматированного ввода-вывода восстанавливается ширина поля по умолчанию. Заполнитель и тип выравнивания остаются без изменений до тех пор, пока они ие будут модифицированы явно. right 6 -42 0.12 Q Q internal 6 ~ 42 0.12 Q Q В ходе стандартизации были изменены правила выравнивания отдельных символов. До стандартизации при выводе отдельных символов ширина поля игнорировалась. Она использовалась при следующей операции форматированного вывода, в которой выводился не одиночный символ. Ошибка была исправлена, но это привело к нарушению совместимости с программами, в которых эта особенность использовалась. В табл. 13.16 перечислены манипуляторы, изменяющие ширину поля, заполнитель и тип выравнивания. Таблица 13.16. Манипуляторы для управления шириной поля, заполнителем и типом выравнивания Манипулятор Описание setw(val) Устанавливает ширину поля при вводе и выводе равной val (соответствует функции width()) setfill(c) Назначает заполнителем симвоп с (соответствует функции fill()) left Устанавливает выравнивание по левому краю right Устанавливает выравнивание по правому краю Internal Устанавливает выравнивание знака по левому краю, а значения - по правому краю Манипуляторам setw() и setfill() должен передаваться аргумент, поэтому для их использования в программу необходимо включить заголовочный файл <iomanip>. Например, рассмотрим такой фрагмент: #1nclude <iostreani> #include <1oman1p> std::cout std::setw(8) std::setfiП( ) -3.14 42 std::endl: Std::C0Ut std;;setw(8) sum: std:;setw(8) 42 std::endl: Этот фрагмент выводит следующий результат: -3.14 42 sum: 42 В табл. 13.15 показаны результаты применения разных флагов. В качестве заполнителя используется символ подчеркивания. Таблица 13.15. Примеры выравнивания Флаг WidthO 2 0.12 Q Q left 6 -42 0.12 О О Использование при вводе ширины поля Ширина поля также позволяет задать максимальное количество символов, вводимых при чтении последовательностей символов типа char*. Если значение WidthO отлично от О, то из потока данных читаются не более width()-l символов. Поскольку обычные С-строки ие могут увеличиваться при чтении данных, при их чтении оператором >> всегда следует ограничивать максимальный размер ввода функциями width() или setw(). Пример: char buffer[81]: Чтение не более 80 символов cin setw(s1zeof(buffer)) buffer: Функция читает не более 80 символов, хотя sizeof(buffer) возвращает 81, поскольку один символ является признаком завершения строки (он присоединяется автоматически). Обратите внимание иа распространенную ошибку: char* s: cin setw(5izeof(s) s: ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ Дело в том, что s объявляется как указатель без выделения памяти под символы, поэтому si2eof(s) возвращает размер указателя вместо размера памяти, на которую он ссылается. Это одна из типичных ошибок, возникающих при работе с С-строками. Строковые классы позволяют предотвратить подобные ошибки: string buffer: cin buffer; OK Отображение знака для положительных чисел вывод в верхнем регистре в табл. 13.17 представлены форматные флаги showpos и uppercase, определяющие общий вид числовых значений. Таблица 13.17. Флаги управления знаком и регистром символов в числовых значениях Манипулятор Описание showpos Вывод знака для положительных чисел uppercase Вывод символов в верхнем регистре Установка флага iosiishowpos означает, что положительные числа должны выводиться со знаком. Если флаг сброшен, то со знаком выводятся только отрицательные числа. Флаг ios::uppercase означает, что буквы в числовых значениях должны выводиться в верхнем регистре. Этот флаг распространяется как на целые числа, записанные в шестнадцатеричном виде, так и на вещественные числа в научной (экспоненциальной) записи. По умолчанию положительные числа
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |