Управление форматированием с помощью манипуляторов


Последний из трех рассматриваемых способов управления форматированием данных – применение манипуляторов.Манипуляторами называются функции, которые можно включать в цепочку последовательных операций помещения и извлечения. Манипуляторы обеспечивают удобный способ управления флагами и модификации атрибутов форматирования потока (частично дублируя возможности, предоставляемые рассмотренными функциями-элементами класса ios), хотя их применение не ограничивается модификациями формата ввода-вывода. При выполнении манипулятора никаких обменов данными с потоком не происходит, но манипулятор в качестве побочного эффекта изменяет состояние потока.

Манипуляторы библиотеки потоков C++ делятся на две группы: простые(не имеющие аргументов) и параметризованные(требующие спецификации аргументов). Простые манипуляторы описаны в файле iostream.h. Параметризованные требуют включения в текст программы заголовочного файла iomanip.h, содержащего их описания.

Перечислим простые манипуляторы:

· dec, hex и oct для входных и выходных потоков устанавливают соответственно флаги десятичной (ios::dec), шестнадцатеричной (ios::hex) и восьмеричной (ios::oct) систем счисления;

· ws действует только при вводе (определен для входных потоков в классе istream) и устанавливает флаг ios::skipws, тем самым заставляя поток игнорировать ведущие пробельные символы;

· ends действует только при выводе (определен для выходных потоков в классе ostream) и обеспечивает помещение в поток нулевого признака конца строки ‘\0’;

· flush действует только при выводе и очищает выходной поток (выгружает содержимое его буфера, записывая данные на соответствующие физические устройства);

· endl действует только при выводе и помещает в выходной поток символ конца строки ‘\n’, после чего очищает поток, как и манипулятор flush.

Использование манипуляторов dec, hex и oct не требует дополнительных пояснений:

cout « 15 « oct « 15 « hex « 15; // Выводит 1517f

Манипулятор endl рекомендуется использовать при каждом выводе, который должен быть незамедлительно воспринят пользователем, например:

cout << "Ждите! Идет выполнение операции." << endl;

При отсутствии endl здесь нельзя гарантировать, что сообщение не останется в буфере потока cout до окончания выполнения операции. По этой же причине рекомендуется с помощью манипулятора flush «сбрасывать» буфер потока при выводе на экран подсказки до последующего ввода информации:

cout << "Имя файла: " << flush; cin >> fileName;

Формат декларации манипуляторов без параметров:

оstream & endl(ostream&); // вставляет конец строки и flush

ostream & ends(ostream&); // вставляет нулевой конец строки

ostream & flush(ostream&);// очищает ostream

ios & dec(ios&); // устанавливает десятичное основание

ios & hex (ios&); // шестнадцатеричное основание

ios & oct(ios&); // восьмеричное основание

istream & ws (istream&); // извлекает пробельные символы

Таким образом, оба класса istream и ostream перегружают соответственно операции извлечения и помещения для второго операнда — указателя на функцию-манипулятор.

Кроме использования стандартных манипуляторов программист может создавать собственные манипуляторы. Их аргумент и код возврата должен иметь тип ссылки на соответствующий потоковый класс.

Параметризованные манипуляторы выполняют над потоком действия, специфицированные указанным значением аргумента.

· setbase(int) устанавливает основание системы счисления, манипулируя флагами форматирования ios::dec, ios::oct и ios::hex потока; значениями параметра могут быть 0, 8, 10 или 16. При использовании параметра 0 основание счисления при выводе выбирается десятичным, а при вводе нулевой параметр означает, что целые десятичные цифры должны обрабатываться по правилам стандарта ANSI языка Си.

· resetiosflags(long) для входных и выходных потоков сбрасывает флаги форматирования, биты которых установлены в переданном параметре.

· setiosflags(long) для входных и выходных потоков устанавливает флаги форматирования, биты которых установлены в переданном параметре.

· setfill(int) устанавливает код символа заполнения для ios::x_fill в соответствии со значением параметра.

· setprecision(int) задает точность представления вещественных чисел (значение ios::precision).

· setw(int) устанавливает ширину поля входных и выходных потоков (значение ios::width). Действие распространяется до первой операции обмена данными с потоком.



Дата добавления: 2021-07-22; просмотров: 304;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.