[Turn] Salida formateada C ++ cout

[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

Supongo que te gusta

Origin blog.csdn.net/weixin_44338712/article/details/108411414
Recomendado
Clasificación