C++STL---<iomanip>

<iomanip> 是 C++ 标准库中一个非常重要的头文件,它提供了一组用于输入/输出流格式化的工具。通过这些工具,程序员可以方便地调整输出格式,比如设置宽度、对齐方式、精度等。


1. 基本概念

<iomanip> 提供了一些流操纵器(manipulators),这些操纵器可以通过插入操作符(<<>>)与流对象结合使用,用来改变流的行为。例如,可以控制小数点位数、设置输出宽度等。

这些操纵器可以分为两类:

  • 状态操纵器:改变流的状态,直到显式更改为止(如 std::setprecision)。
  • 非状态操纵器:只对当前操作生效(如 std::setw)。

2. 常用操纵器

2.1 设置宽度:std::setw

  • 功能:设置输出的宽度(字符数)。如果数据长度小于宽度,默认用空格填充。
  • 作用范围:仅对当前流操作有效。
  • 语法
    std::setw(n)
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        std::cout << std::setw(10) << 42 << std::endl;  // 输出:        42
        std::cout << 42 << std::endl;                  // 输出:42
        return 0;
    }
    

2.2 填充字符:std::setfill

  • 功能:设置宽度不足时填充的字符。
  • 作用范围:直到显式更改为止。
  • 语法
    std::setfill(c)
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        std::cout << std::setfill('*') << std::setw(10) << 42 << std::endl;  // 输出:********42
        return 0;
    }
    

2.3 对齐方式:std::leftstd::rightstd::internal

  • 功能:设置输出内容的对齐方式。
    • std::left:左对齐。
    • std::right:右对齐(默认)。
    • std::internal:符号靠左,其余部分右对齐(常用于数字)。
  • 作用范围:直到显式更改为止。
  • 语法
    std::left
    std::right
    std::internal
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        std::cout << std::left << std::setw(10) << 42 << std::endl;    // 输出:42        
        std::cout << std::right << std::setw(10) << 42 << std::endl;   // 输出:        42
        std::cout << std::internal << std::setw(10) << -42 << std::endl; // 输出:-       42
        return 0;
    }
    

2.4 设置浮点数精度:std::setprecision

  • 功能:设置浮点数的有效位数(默认是总位数,结合 std::fixedstd::scientific 可改变行为)。
  • 作用范围:直到显式更改为止。
  • 语法
    std::setprecision(n)
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        double pi = 3.14159265358979;
    
        std::cout << std::setprecision(5) << pi << std::endl;  // 输出:3.1416
        std::cout << std::fixed << std::setprecision(5) << pi << std::endl;  // 输出:3.14159
        return 0;
    }
    

2.5 固定小数点与科学计数法:std::fixedstd::scientific

  • 功能
    • std::fixed:以固定小数点格式输出浮点数。
    • std::scientific:以科学计数法格式输出浮点数。
  • 作用范围:直到显式更改为止。
  • 语法
    std::fixed
    std::scientific
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        double pi = 3.14159265358979;
    
        std::cout << std::fixed << std::setprecision(2) << pi << std::endl;        // 输出:3.14
        std::cout << std::scientific << std::setprecision(2) << pi << std::endl;  // 输出:3.14e+00
        return 0;
    }
    

2.6 显示符号:std::showposstd::noshowpos

  • 功能
    • std::showpos:对正数显示 + 符号。
    • std::noshowpos:关闭符号显示(默认)。
  • 作用范围:直到显式更改为止。
  • 语法
    std::showpos
    std::noshowpos
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        std::cout << std::showpos << 42 << std::endl;   // 输出:+42
        std::cout << std::noshowpos << 42 << std::endl; // 输出:42
        return 0;
    }
    

2.7 显示进制:std::hexstd::octstd::dec

  • 功能
    • std::hex:以十六进制输出。
    • std::oct:以八进制输出。
    • std::dec:以十进制输出(默认)。
  • 作用范围:直到显式更改为止。
  • 语法
    std::hex
    std::oct
    std::dec
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        int num = 42;
    
        std::cout << std::dec << num << std::endl;  // 输出:42
        std::cout << std::hex << num << std::endl;  // 输出:2a
        std::cout << std::oct << num << std::endl;  // 输出:52
        return 0;
    }
    

2.8 显示进制前缀:std::showbasestd::noshowbase

  • 功能
    • std::showbase:显示进制的前缀(如 0x 表示十六进制,0 表示八进制)。
    • std::noshowbase:关闭前缀显示(默认)。
  • 作用范围:直到显式更改为止。
  • 语法
    std::showbase
    std::noshowbase
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        int num = 42;
    
        std::cout << std::showbase << std::hex << num << std::endl;  // 输出:0x2a
        std::cout << std::noshowbase << std::oct << num << std::endl; // 输出:52
        return 0;
    }
    

2.9 大小写控制:std::uppercasestd::nouppercase

  • 功能
    • std::uppercase:大写输出字母(如十六进制中的 A-F)。
    • std::nouppercase:小写输出字母(默认)。
  • 作用范围:直到显式更改为止。
  • 语法
    std::uppercase
    std::nouppercase
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        int num = 42;
    
        std::cout << std::hex << std::uppercase << num << std::endl;   // 输出:2A
        std::cout << std::nouppercase << num << std::endl;            // 输出:2a
        return 0;
    }
    

2.10 固定布尔值格式:std::boolalphastd::noboolalpha

  • 功能
    • std::boolalpha:布尔值以 truefalse 输出。
    • std::noboolalpha:布尔值以 10 输出(默认)。
  • 作用范围:直到显式更改为止。
  • 语法
    std::boolalpha
    std::noboolalpha
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        std::cout << std::boolalpha << true << std::endl;   // 输出:true
        std::cout << std::noboolalpha << true << std::endl; // 输出:1
        return 0;
    }
    

2.11 重置格式:std::resetiosflagsstd::setiosflags

  • 功能
    • std::resetiosflags:重置指定的格式标志。
    • std::setiosflags:设置指定的格式标志。
  • 作用范围:直到显式更改为止。
  • 语法
    std::resetiosflags(flag)
    std::setiosflags(flag)
    
  • 示例
    #include <iostream>
    #include <iomanip>
    
    int main() {
        std::cout << std::setiosflags(std::ios::fixed | std::ios::showpos)
                  << std::setprecision(2) << 42.5 << std::endl;  // 输出:+42.50
    
        std::cout << std::resetiosflags(std::ios::showpos) << 42.5 << std::endl;  // 输出:42.50
        return 0;
    }
    

3. 总结

<iomanip> 提供了丰富的流操纵器,可以灵活地控制输出格式。这些操纵器在调试、日志记录和用户界面设计中非常有用。掌握这些工具,可以极大地提高程序的可读性和美观性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值