[Turn] Salida formateada C ++ cout
Transferir desde aquí
A veces, desea generar la salida de acuerdo con un formato determinado, como generar números enteros en hexadecimal, dejar dos dígitos después del punto decimal cuando se generan números de punto flotante, generar números enteros con un ancho de 6 dígitos y rellenar 0 a la izquierda cuando el ancho es insuficiente, etc. La función printf () en lenguaje C usa %
símbolos de control de formato que comienzan con, como% X,% .2f,% 6d, etc.; El objeto cout en C ++ usa operadores de flujo (también puede llamar símbolos de control de formato) o miembros Función a controlar.
Usar operadores de flujo
Los operadores de manipulación de flujo de salida comúnmente utilizados en C ++ se muestran en la Tabla 1. Todos están definidos en el archivo de encabezado iomanip; para usar estos operadores de manipulación de flujo, se debe incluir el archivo de encabezado.
Nota: El asterisco en la columna "Operador de manipulación de flujo"
*
no es parte del operador. El asterisco significa que si no se usa ningún operador, es equivalente a usar el operador. Por ejemplo, de forma predeterminada, los números enteros se generan en formato decimal, lo que equivale a utilizar el operador dec.
Operador de flujo | Utilizar | |
---|---|---|
*dic | Entero de salida en forma decimal | Comúnmente utilizado |
maleficio | Enteros de salida en forma hexadecimal | |
oct | Entero de salida en forma octal | |
fijo | Salida de números de punto flotante como decimales ordinarios | |
científico | Salida de números de punto flotante en notación científica | |
izquierda | Justificado a la izquierda, es decir, los caracteres de relleno se agregan a la derecha cuando el ancho es insuficiente | |
*derecho | Alineado a la derecha, es decir, cuando el ancho es insuficiente, los caracteres de relleno se agregan a la izquierda | |
setbase (b) | Establezca la base al generar números enteros, b = 8, 10 o 16 | |
setw (w) | Especifique el ancho de salida como w caracteres, o lea w caracteres al ingresar una cadena de caracteres | |
setfill © | Cuando se especifica el ancho de salida, cuando el ancho de salida es insuficiente, se usa el carácter c para rellenar (el valor predeterminado es rellenar con espacios) | |
setprecision (n) | Establezca la precisión del número de coma flotante de salida en n. En el caso de producción no fija y no científica, n es el número de dígitos significativos. Si el número de dígitos significativos excede n, la parte decimal se redondeará o se convertirá automáticamente a notación científica y se mantendrá en total. n dígitos significativos. En el caso de la producción fija y científica, n es el número de dígitos que deben mantenerse después del punto decimal. | |
setiosflags (bandera) | Establecer una marca de formato de salida en 1 | |
resetiosflags (bandera) | Establecer una marca de formato de salida en 0 | |
boolapha | Salida verdadero y falso como cadenas | poco utilizado |
* noboolalpha | Salida verdadero y falso como 0, 1 | |
showbase | Salida del prefijo de la base del valor | |
* noshowbase | No envíe el prefijo de la base. | |
showpoint | Salida siempre el punto decimal | |
* noshowpoint | Muestra el punto decimal solo cuando existe la parte decimal | |
showpos | Mostrar en valores no negativos + | |
* noshowpos | No mostrar en valores no negativos + | |
* skipws | Omitir caracteres en blanco al escribir | |
noskipws | No omita los caracteres en blanco al escribir | |
mayúsculas | Utilice A ~ E en número hexadecimal. Si se emite el prefijo, el prefijo emite 0X y el resultado E en notación científica | |
* nouppercase | Utilice a ~ e en números hexadecimales. Si se genera el prefijo, el prefijo genera 0x y, en notación científica, genera e. | |
interno | El signo (más o menos) del valor se alinea a la izquierda dentro del ancho especificado, el valor se alinea a la derecha y el medio se rellena con caracteres de relleno. |
Cómo utilizar los operadores de flujo
La forma de utilizar estos operadores es utilizar << y cout juntos. P.ej:
cout << hex << 12 << "," << 24;
La función de esta declaración es especificar los siguientes dos números para que se generen en forma hexadecimal, por lo que el resultado de salida es:
c, 18
setiosflags () Aritmética
El operador setiosflags () es en realidad una función de biblioteca. Toma algunas banderas como parámetros. Estas banderas pueden ser los siguientes valores definidos en el archivo de encabezado de iostream. Su significado es el mismo que el del operador del mismo nombre.
Firmar | Utilizar |
---|---|
ios :: izquierda | Los datos de salida se alinean a la izquierda dentro del amplio rango de este campo. |
ios :: derecho | Los datos de salida se alinean a la derecha dentro del amplio rango de este campo. |
ios :: interno | 数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充 |
ios::dec | 设置整数的基数为 10 |
ios::oct | 设置整数的基数为 8 |
ios::hex | 设置整数的基数为 16 |
ios::showbase | 强制输出整数的基数(八进制数以 0 开头,十六进制数以 0x 打头) |
ios::showpoint | 强制输出浮点数的小点和尾数 0 |
ios::uppercase | 在以科学记数法格式 E 和以十六进制输出字母时以大写表示 |
ios::showpos | 对正数显示“+”号 |
ios::scientific | 浮点数以科学记数法格式输出 |
ios::fixed | 浮点数以定点格式(小数形式)输出 |
ios::unitbuf | 每次输出之后刷新所有的流 |
ios::stdio | 每次输出之后清除 stdout, stderr |
这些标志实际上都是仅有某比特位为 1,而其他比特位都为 0 的整数。
多个标志可以用|
运算符连接,表示同时设置。例如:
cout << setiosflags(ios::scientific|ios::showpos) << 12.34;
输出结果是:
+1.234000e+001
如果两个相互矛盾的标志同时被设置,如先设置 setiosflags(ios::fixed),然后又设置 setiosflags(ios::scientific),那么结果可能就是两个标志都不起作用。因此,在设置了某标志,又要设置其他与之矛盾的标志时,就应该用 resetiosflags 清除原先的标志。例如下面三条语句:
cout << setiosflags(ios::fixed) << 12.34 << endl;
cout << resetiosflags(ios::fixed) << setiosflags(ios::scientific | ios::showpos) << 12.34 << endl;
cout << resetiosflags(ios::showpos) << 12.34 << endl; //清除要输出正号的标志
输出结果是:
12.340000
+1.234000e+001
1.234000e+001
综合示例
关于流操纵算子的使用,来看下面的程序。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n = 141;
//1) 分别以十六进制、十进制、八进制先后输出 n
cout << "1)" << hex << n << " " << dec << n << " " << oct << n << endl;
double x = 1234567.89, y = 12.34567;
//2)保留5位有效数字
cout << "2)" << setprecision(5) << x << " " << y << " " << endl;
//3)保留小数点后面5位
cout << "3)" << fixed << setprecision(5) << x << " " << y << endl;
//4)科学计数法输出,且保留小数点后面5位
cout << "4)" << scientific << setprecision(5) << x << " " << y << endl;
//5)非负数显示正号,输出宽度为12字符,宽度不足则用 * 填补
cout << "5)" << showpos << fixed << setw(12) << setfill('*') << 12.1 << endl;
//6)非负数不显示正号,输出宽度为12字符,宽度不足则右边用填充字符填充
cout << "6)" << noshowpos << setw(12) << left << 12.1 << endl;
//7)输出宽度为 12 字符,宽度不足则左边用填充字符填充
cout << "7)" << setw(12) << right << 12.1 << endl;
//8)宽度不足时,负号和数值分列左右,中间用填充字符填充
cout << "8)" << setw(12) << internal << -12.1 << endl;
cout << "9)" << 12.1 << endl;
return 0;
}
程序的输出结果是:
1)8d 141 215
2)1.2346e+06 12.346
3)1234567.89000 12.34567
4)1.23457e+06 1.23457e+01
5)***+12.10000
6)12.10000****
7)****12.10000
8)-***12.10000
9)12.10000
需要注意的是,setw() 算子所起的作用是一次性的,即只影响下一次输出。每次需要指定输出宽度时都要使用 setw()。因此可以看到,第 9) 行的输出因为没有使用 setw(),输出的宽度就不再是前面指定的 12 个字符。
在读入字符串时,setw() 还能影响 cin 的行为。例如下面的程序:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
string s1, s2;
cin >> setw(4) >> s1 >> setw(3) >> s2;
cout << s1 << "," << s2 << endl;
return 0;
}
输入:
1234567890↙
程序的输出结果是:
1234,567
说明setw(4)
使得读入 s1 时,只读入 4 个字符,其后的setw(3)
使得读入 s2 时只读入 3 个字符。
setw() 用于 cin 时,同样只影响下一次的输入。
思考题:setw() 究竟是如何实现的,以至于能和 cout 连用来指定输出宽度?自行查看编译器所带的 iomanip 头文件,然后写一个功能和 setw() 完全相同的 mysetw()。
调用cout的成员函数
ostream 类有一些成员函数,通过 cout 调用它们也能用于控制输出的格式,其作用和流操纵算子相同,如表 3 所示。
成员函数 | 作用相同的流操纵算子 | 说明 |
---|---|---|
precision(n) | setprecision(n) | 设置输出浮点数的精度为 n。 |
width(w) | setw(w) | 指定输出宽度为 w 个字符。 |
fill© | setfill © | 在指定输出宽度的情况下,输出的宽度不足时用字符 c 填充(默认情况是用空格填充)。 |
setf(flag) | setiosflags(flag) | 将某个输出格式标志置为 1。 |
unsetf(flag) | resetiosflags(flag) | 将某个输出格式标志置为 0。 |
setf 和 unsetf 函数用到的flag
,与 setiosflags 和 resetiosflags 用到的完全相同。
这些成员函数的用法十分简单。例如下面的三行程序:
cout.setf(ios::scientific);
cout.precision(8);
cout << 12.23 << endl;
输出结果是:
1.22300000e+001