12: char *phraseTwo = "Here's some values: ";
13: char *phraseThree = " and also these: ";
14: int у = 7, z = 35;
15: long longVar = 98456;
16: float floatVar = 8.8f;
17:
18: printf("%s %d %d %s %ld %f\n",phraseTwo,y,z, phraseThree,longVar,floatVar);
19:
20: char *phraseFour = "Formatted: ";
21: printf("%s %5d %10d %10.5f\n",phraseFour,y,z,floatVar);
22: return 0;
23: }
Результат:
hello world
Hello again!
5
Here's some values: 7 35 and also these: 98456 8.800000
Formatted: 7 35 8.800000
Анализ: Первый раз функция printf вызывается в строке 4 и имеет стандартную форму: за именем функции printf следует спецификатор преобразования (в данном случае %s) и константная строка в кавычках, выводимая на экран.
Спецификатор %s указывает, что в данный момент выводится текстовая' строка, указанная далее, — "hello world".
Второй вызов функции printf в строке 7 аналогичен первому, но в данном случае вместо константной строки, заключенной в кавычки, используется указатель типа char.
В третьем вызове printf в строке 10 используется спецификатор вывода целочисленного значения, хранимого в переменной x. Еще более сложным оказывается четвертый вариант вызова функции printf, показанный в строке 18. Здесь выводится сразу шесть значений. Каждому приведенному спецификатору отвечает свое значение, отделенное от остальных с помощью запятых.
Наконец, в строке 21 в уже хорошо известной вам функции printf используются спецификаторы форматирования, определяющие длину и точность выводимых значений. Многие считают, что форматирование вывода данных с помощью спецификаторов функции printf намного проще, чем с помощью манипуляторов объекта cout.
Ранее уже отмечались основные недостатки функции printf — отсутствие строгого контроля за типами данных и невозможность объявления этой функции как друга или метода класса. Поэтому при необходимости распечатать данные различных членов класса нужно использовать явно заданные методы доступа к членам класса.
Обобщение методов управления выводом данных в программах на C++
Для форматирования вывода данных в C++ можно использовать комбинации специальных символов, манипуляторов и флагов.
В выражениях с объектом cout используются следующие специальные символы:
Пример выражения вывода строки:
cout "\aAn error occured\t"
Указанное выражение не только выводит сообщение об ошибке на экран компьютера. но подает предупреждающий звуковой сигнал и выполняет переход к следующей позиции табуляции. С оператором cout используются также манипуляторы. Однако для использования большинства манипуляторов нужно включить в программу файл iomanip.h. Далее вашему вниманию представлен список манипуляторов, не требующих включения iomanip.h:
flush — очищает буфер вывода;
endl — вставляет символ разрыва строки и очищает буфер вывода;
oct — устанавливает восьмеричное основание для выводимых чисел;
dec — устанавливает десятичное основание для выводимых чисел;
hex — устанавливает шестнадцатеричное основание для выводимых чисел.
А теперь приведем набор манипуляторов, для которых необходимо включение iomanip.h:
setbase (основание) — устанавливает основание для выводимых чисел (0 = десятичная, 8 = восьмеричная, 10 = десятичная, 16 = шестнадцатеричная);
setw (ширина) — устанавливает минимальную ширину поля вывода;
setfill (символ) — устанавливает символ заполнения незанятых позиций поля вывода;
setprecision (точность) — устанавливает число знаков после плавающей запятой; setiosflags (флаг) —устанавливает один или несколько флагов;
resetiosflags (флаг) — сбрасывает один или несколько флагов.
Например, в строке
cout setw(12) setfill ("#') hex x endl;
устанавливается ширина поля в 12 знаков, символ заполнения #, восьмеричное основание выводимых чисел, после чего выводится значение переменной x, добавляется символ разрыва строки и очищается буфер. Все манипуляторы, за исключением flush, endl и setw, остаются включенными на протяжении всей работы программы, если, конечно, не будут сделаны другие установки. Установка манипулятора setw отменяется сразу же после текущего вывода с объектом cout.
С манипуляторами setiosflags и resetiosflags могут использоваться следующие ювнфлаги:
iоs::left — выравнивает данные по левому краю поля вывода;
ios::right — выравнивает данные по правому краю поля вывода;
ios::interval — выравнивает данные по ширине поля вывода;
ios::dec — выводит данные в десятичном формате;
ios::oct — выводит данные в восьмеричном формате;
ios::hex — выводит данные в шестнадцатеричном формате;
ios::showbase — добавляет префикс 0x к шестнадцатеричным значениям и О к восьмеричным значениям;