Ранее уже отмечались основные недостатки функции printf() — отсутствие строгого контроля за типами данных и невозможность объявления этой функции как друга или метода класса. Поэтому при необходимости распечатать данные различных членов класса нужно использовать явно заданные методы доступа к членам класса.
Обобщение методов управления выводом данных в программах на C++
Для форматирования вывода данных в C++ можно использовать комбинации специальных символов, манипуляторов и флагов.
В выражениях с объектом cout используются следующие специальные символы:
\n — новая строка;
\r — возврат каретки;
\t — табуляция;
\\ — обратный слеш;
\ddd (число в восьмеричном коде) — символ ASCII;
\a — звуковой сигнал (звонок).
Пример выражения вывода строки:
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 <
устанавливается ширина поля в 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 к шестнадцатеричным значениям и О к восьмеричным значениям;
ios::showpoint— заполняет нулями недостающие знаки в значениях заданной длины;
ios::uppercase— отображает в верхнем регистре шестнадцатеричные и экспоненциальные значения;
ios::showpos— добавляет знак '+' перед положительными числами;
ios::scientific— отображает числа с плавающей запятой в экспоненциальном представлении;
ios::fixed— отображает числа с плавающей запятой в шестнадцатеричном представлении.
Дополнительную информацию можно получить из файла ios.h или из справочной системы компилятора.
Использование файлов для ввода и вывода данных
Потоки C++ обеспечивают универсальные методы обработки данных, поступающих с клавиатуры или диска, а также выводимых на экран и диск. В любом случае можно использовать либо операторы ввода и вывода, либо другие стандартные функции и манипуляторы. Дальнейшие разделы главы посвящены операциям открытия и закрытия файлов, которые сопровождаются созданием объектов ifstream и ofstream.
Объекты, создаваемые для считывания или записи данных в файл, называются ofstream. Они являются производными от уже знакомого вам класса iostream.
Читать дальше