Использование операторов вставки и управление форматом
В этом разделе показано, как в формат элемента управления и созданию операторы вставки для собственных классов. Оператор insert (<<), который предпрограммирован для всех стандартных типов данных C++, отправляет байты в объект потока вывода. Операторы вставки работают с предопределенными «манипуляторами», элементы, которые влияют на формат по умолчанию аргументов целые числа.
Элемент управления можно форматировать со следующими параметрами:
Ширина вывода
Выравнивание
Точность
Корень
Ширина вывода
Для выравнивания элементов выходных данных указать ширину выходных файлов для каждого элемента, установив манипулятора setw в потоке или путем вызова функции-члена width. В этом примере является выравнивание значений в столбце по крайней мере имеет ширину 10 символов.
// output_width.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
for( int i = 0; i < 4; i++ )
{
cout.width(10);
cout << values[i] << '\n';
}
}
Output
1.23
35.36
653.7
4358.24
Начальные пробелы добавлены в любое значение, чем имеет ширину 10 символов.
Чтобы начало поле используйте функции-члена fill, который задает значение символа для заполнения полей, имеющих определенную ширину. По умолчанию пробел. Чтобы начало столбец чисел с звездочками измените предыдущего цикла for следующим образом:
for( int i = 0; i < 4; i++ )
{
cout.width( 10 );
cout.fill( '*' );
cout << values[i] << endl;
}
Манипулятор endl заменяет символ новой строки ('\n'). Выходные данные выглядят следующим образом:
******1.23
*****35.36
*****653.7
***4358.24
Чтобы задать ширину для элементов данных в той же линии, используйте манипулятора setw:
// setw.cpp
// compile with: /EHsc
#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
char *names[] = { "Zoot", "Jimmy", "Al", "Stan" };
for( int i = 0; i < 4; i++ )
cout << setw( 6 ) << names[i]
<< setw( 10 ) << values[i] << endl;
}
Output
Функцию-член width объявлен в <iostream>. При использовании setw или любой другой манипулятора с аргументами, необходимо включить <iomanip>. На выходе, строки будут напечатаны вместе в поле шириной 6 и целых чисел в поле шириной 10:
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
Ни setw ни width усекают значения. Если форматированный вывод превышает длину, то все значения типа, в зависимости от параметра точности потока. И setw и width влияют на следующее поле только. Ширина поля отменить его реакции на событие по умолчанию (необходимой ширины) после создания одно поле будет выводиться. Однако другие параметры формата потока не будут оставаться в силе, пока изменено.
Выравнивание
Потоки вывода не имеют по умолчанию значение выровненному по правому краю тексту. Чтобы выровнять имена в предыдущем примере, и является выравнивание числа, замените цикл for следующим образом:
for ( int i = 0; i < 4; i++ )
cout << setiosflags( ios::left )
<< setw( 6 ) << names[i]
<< resetiosflags( ios::left )
<< setw( 10 ) << values[i] << endl;
Выходные данные выглядят следующим образом:
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
Выровнять флажок установлен с помощью манипулятора setiosflags с перечислителем левая. Этот перечислитель определяется в классе ios, поэтому его ссылка должна содержать префикс ios::. Манипулятор resetiosflags отключается флажок по центру. В отличие от width и setw, результат setiosflags и resetiosflags постоянным.
Точность
Значение по умолчанию для точности с плавающей запятой 6. Например, число 3466.9768 выводится как 3466.98. Чтобы изменить способ это значение типа, используется манипулятора setprecision. Манипулятор 2 имеет флажка. зафиксировать и scientific. Если зафиксировать присвоено, то число выводится как 3466.976800. Если задано scientific , оно типом 3.4669773+003.
Для отображения чисел с плавающей запятой показанных в Выравнивание с одной значащей цифрой, замените цикл for следующим образом:
for ( int i = 0; i < 4; i++ )
cout << setiosflags( ios::left )
<< setw( 6 )
<< names[i]
<< resetiosflags( ios::left )
<< setw( 10 )
<< setprecision( 1 )
<< values[i]
<< endl;
Программа позволяет этот список.
Zoot 1
Jimmy 4e+001
Al 7e+002
Stan 4e+003
Чтобы исключить экспоненциальную нотацию, вставьте эту оператора перед цикл for.
cout << setiosflags( ios::fixed );
Нотации с фиксированной, программа выводит с одной цифрой после десятичной запятой.
Zoot 1.2
Jimmy 35.4
Al 653.7
Stan 4358.2
При изменении флажок ios::fixed в ios::scientific, программа выводит это:
Zoot 1.2e+000
Jimmy 3.5e+001
Al 6.5e+002
Stan 4.4e+003
Опять же, программа выводит одну цифру после десятичной запятой. Если ios::fixed или ios::scientific установлены, точность значение определяет количество цифр после десятичной запятой. Если флажок не установлен, точность значение определяет общее количество значащих цифр. Манипулятор resetiosflags удаляет эти флажки.
Корень
dec, oct И hex манипуляторов установить корневой каталог по умолчанию для входных и выходных данных. Например, при вставке манипулятора hex в поток вывода, объект правильно преобразует представление внутренних данных целых чисел в шестнадцатеричный формат вывода. Числа отображаются как с a по f в нижнем регистре, если флажок прописные определяется, (по умолчанию); в противном случае они отображаются в верхний случае. Корневой каталог по умолчанию dec (десятичное число).