C++学习笔记29:流操纵算子

1 整数流的基数:流操纵算子 dec, oct, hex, setbase(指定任何进制输出)
2 浮点数的精度(precision, setprecision)
3 设置域宽(setw, width):

例如想要输出一个整数时,要输出10个字符那么宽,实际上它没有10个字符那么宽,不足的部分我可以补空格或者补0

4 用户自定义的流操纵算子
5 使用流操纵算子,需要 #include iomanip
6 整数流的基数:流操纵算子dec, doc, hex

    int n = 10;
    cout << n << endl;
    cout << hex << n << "\n"
         << dec << n << "\n"
         << oct << n << endl;
    输出结果: 10 a 10 12

7 控制浮点数精度的流操纵算子

    -- precision是成员函数,其调用方式为:cout.precition(5);
    -- setprecision是流操作算子,其调用方式为:cout << setprecision(5);   // 可以连续输出 即是连续起作用,设置一个之后,后面其他浮点数都按照这个格式输出

    它们的功能相同。
    指定输出浮点数的有效位数(非定点方式输出时)
    指定输出浮点数的小数点后的有效位数(定点方式输出时)
    定点方式:小数点必须出现在个位数后面
    非定点方式:小数点不在个位数后面 例如科学计数法
    eg:(见本工程fudian.cpp)  (fudian1.cpp)
//
// 控制浮点数精度的流操纵算子 非定点方式输出
//

#include 
#include 

using namespace std;

int main()
{
    double x = 1234567.89, y = 12.34567;
    int n = 1234567;
    int m = 12;
    // 设置精度为6 缺省的方式下为非定点方式
    // 由于是非定点方式,所以输出x需要6位有效数字。但是x整数部分就有7位,只能输出6位有效数字,只能采用科学计数法的方式输出
    // x输出结果为1.23457e+06  就是1.23457*10的6次方
    // y有效数字为7位,通过四舍五入,取6位有效数字 因此y输出12.3457
    // n 是整数不受控制浮点精度的流操纵算子的影响,因此还会输出1234567
    // m同理
    cout << setprecision(6) << x << endl << y << endl << n << endl << m;
}


//
// 控制浮点数精度的流操纵算子 定点方式输出
//

#include 
#include 

using namespace std;

int main()
{
    double x = 1234567.89, y = 12.34567;
    int n = 1234567;
    int m = 12;
    // setiosflags(ios::fixed) 设置以小数点位置固定的方式输出,也就是定点输出
    // resetiosflags(ios::fixed) 取消以小数点位置固定的方式输出
    cout << setiosflags(ios::fixed) << setprecision(6) << x << endl << resetiosflags(ios::fixed) << y << endl << n << endl << m;
}


8 设置域宽的流操纵算子

    -- 设置域宽(setw, width)
        两者功能相同,一个是成员函数,另一个是流操作算子,调用方式不同:
        cin >> setw(4); 或者 cin.width(5);
        cout << setw(4); 或者 cout.width(5);
    -- eg(见本工程yukuan.cpp)
    -- 宽度设置有效性是一次性的,在每次读入和输出之前都要设置宽度

9 综合的流操纵算子的例子(liucaozong.cpp)

//
// 综合的流操纵算子的例子
//
#include 
#include 

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字符,宽度不足则右边用填充字符填充  left:左对齐
    cout << "6) " << noshowpos << setw(12) << left << 12.1 << endl;

    // (7)输出宽度为12字符,宽度不足则左边用填充字符填充 right:右对齐
    cout << "7) " << setw(12) << right << 12.1 << endl;

    // (8)宽度不足时候,负号和数值分列左右,中间用填充字符填充
    cout << "8) " << setw(12) << internal << -12.1 << endl;
    cout << "9) " << 12.1 << endl;
    return 0;

}


10 用户自定义流操纵算子

    eg:
        ostream& tab(ostream& output)
        {
            return output << '\t';
        }
        // 函数可以交给cout用于输出,称作流操纵算子
        // 问题:为什么可以吧函数名字写在cout输入语句
        // 解答:因为iostream里对 << 进行了重载(成员函数)
        // ostream& operator<< (ostream& (*p)(ostream&));   // 函数指针
        // 该函数内部会调用p所指向的函数,且*this作为参数  hex, dec, oct都是函数
        cout << "aa" << tab << "bb" << endl;

你可能感兴趣的:(C++)