Форматируемый вывод
Простой ввод/вывод в С++ эффективен потому, что выполняет только минимальные преобразования в соответствии с используемыми типами данных. Для целых чисел преобразование такое же, как определенное по умолчанию преобразование для printf. Предложения
int i=5; cout << i;иint i=5; printf("%d", i);дают одинаковый результат.
Форматирование позволяет определить для каждого активного потока систему исчисления для преобразования (десятичная, восьмеричная и шестнадцатеричная), заполнение слева или справа, формат с плавающей запятой (научный или фиксированный) и будут ли пропускаться при вводе пробелы. Другие параметры, которые можно изменять, включают ширину поля (для вывода) и символ, используемый для заполнения. Эти флаги можно проверять, устанавливать, очищать с помощью различных функций элементов.
int i = 87;cout.width(7); // устанавливает ширину поля, равной 7 cout.fill('*'); // устанавливает символ * для заполненияcout << i << '\n'; // выводит на экран *****87//после << ширина очищается и становится равной 0,cout << i << '\n'; // выводит на экран 87double d=3.14159;cout.precision(4);cout.width(8);cout << d << '\n'; // выводит на экран ***3.142Установление width, равной 0 (по умолчанию) означает, что дисплей будет использовать столько позиций экрана, сколько необходимо. Если заданная ширина недостаточна для правильного представления, то считается, что ширина равна 0 (т.е. усечения нет). По умолчанию заполнение обеспечивает выравнивание справа (заполнение слева) для всех типов.
Setf и unsetf — это две общие функции для установки и очистки флагов формата:
cout.setf(ios::left);Это устанавливает выравнивание слева. Unsetf работает таким же образом, но очищает выбранные биты.
Манипуляторы
Наиболее изящный способ установки флагов формата (и выполнения других функций для потока) использует специальный механизм, известный как манипуляторы. Подобно операторам << и >> манипуляторы могут включаться в цепочку операторов потока:
cout << setw(7) << dec << i << setw(6) << oct << j;cout << setw(7) << setprecision(4) << endl; //вывод d из пред. примераБез манипуляторов понадобилось бы шесть отдельных предложений.
Параметризованный манипулятор setw принимает один аргумент типа int, чтобы установить ширину поля.
Непараметризованные манипуляторы, например, dec, oct и hex устанавливают систему исчисления для преобразования: десятичную, восьмеричную и шестнадцатеричную. В вышеприведенном примере int i будет выводится на экран в десятичном виде в поле шириной 7; int j будет выводится на экран в восьмеричном виде в поле шириной 6.
К другим простым параметризованным манипуляторам относится setbase, setfill, setprecision, setiosflags и resetiosflags. Чтобы использовать любые из параметризованных манипуляторов, программа должна включить оба заголовочных файла: iomanip.h и iostream.h. Непараметризованные манипуляторы не требуют iomanip.h.
Полезные непараметризованные манипуляторы включают:
· ws (извлечение пробелов): istream >> ws; будет устранять любые пробелы в istream.
· endl (конец строки и очистка буфера): ostream << endl; будет вставлять новую строку в ostream, а затем очищает буфер ostream.
· ends (конец строки с нулем): ostream << ends; будет добавлять 0 в ostream.
· flush (очистка буфера): ostream << flush.
Дата добавления: 2016-07-27; просмотров: 1479;