iomanip头文件

晨曦

iomanip 是 C++ 标准库中的一个头文件,它提供了一系列用于格式化输入输出的操纵器(manipulators)。这些操纵器允许你控制浮点数的精度、整数的格式、填充字符、宽度等。以下是一些常用的 iomanip 操纵器及其用法:

1. setprecision

用于设置浮点数的显示精度(总有效数字位数或小数点后的位数,具体取决于 fixedscientific 操纵器)。

#include <iostream>
#include <iomanip>

int main() {
double num = 123.456789;
std::cout << "Default precision: " << num << std::endl;
std::cout << "Precision 3: " << std::setprecision(3) << num << std::endl;
std::cout << "Precision 5: " << std::setprecision(5) << num << std::endl;
return 0;
}

2. fixedscientific

fixed 使得浮点数以定点表示法显示(即总是显示小数点),而 scientific 以科学计数法显示。

#include <iostream>
#include <iomanip>

int main() {
double num = 123.456789;
std::cout << "Default: " << num << std::endl;
std::cout << "Fixed: " << std::fixed << num << std::endl;
std::cout << "Scientific: " << std::scientific << num << std::endl;
return 0;
}

3. setw

用于设置下一个输出字段的宽度。

#include <iostream>
#include <iomanip>

int main() {
int num = 42;
std::cout << "Default width: " << num << std::endl;
std::cout << "Width 10: " << std::setw(10) << num << std::endl;
return 0;
}

4. setfill

用于设置填充字符,通常与 setw 一起使用。

#include <iostream>
#include <iomanip>

int main() {
int num = 42;
std::cout << "Default fill: " << std::setw(10) << num << std::endl;
std::cout << "Fill with '*': " << std::setfill('*') << std::setw(10) << num << std::endl;
return 0;
}

5. left, right, internal

用于设置字段的对齐方式。left 左对齐,right 右对齐,internal 使得填充字符在符号和数字之间(主要用于科学计数法)。

#include <iostream>
#include <iomanip>

int main() {
double num = -123.456;
std::cout << "Default align: " << std::setw(15) << num << std::endl;
std::cout << "Left align: " << std::left << std::setw(15) << num << std::endl;
std::cout << "Right align: " << std::right << std::setw(15) << num << std::endl;
std::cout << "Internal align (scientific): " << std::scientific << std::internal << std::setw(15) << num << std::endl;
return 0;
}

6. boolalphanoboolalpha

用于控制布尔值的输出格式。boolalpha 使布尔值以 truefalse 输出,而 noboolalpha 使其以 10 输出。

#include <iostream>
#include <iomanip>

int main() {
bool flag = true;
std::cout << "Default bool: " << flag << std::endl;
std::cout << "Boolalpha: " << std::boolalpha << flag << std::endl;
std::cout << "Noboolalpha: " << std::noboolalpha << flag << std::endl;
return 0;
}

7. showbasenoshowbase

用于控制是否显示数值的基数前缀(如八进制的 0,十六进制的 0x)。

#include <iostream>
#include <iomanip>

int main() {
int num = 255;
std::cout << "Default base: " << num << std::endl;
std::cout << "Hexadecimal with showbase: " << std::hex << std::showbase << num << std::endl;
std::cout << "Hexadecimal without showbase: " << std::hex << std::noshowbase << num << std::endl;
return 0;
}

8. uppercasenouppercase

用于控制十六进制和八进制数值的输出是否使用大写字母。

#include <iostream>
#include <iomanip>

int main() {
int num = 255;
std::cout << "Default hex: " << std::hex << num << std::endl;
std::cout << "Uppercase hex: " << std::hex << std::uppercase << num << std::endl;
std::cout << "Lowercase hex: " << std::hex << std::nouppercase << num << std::endl;
return 0;
}

这些操纵器可以通过组合使用,以满足各种格式化需求。记住,操纵器通常只对下一个输出操作有效,除非显式地重置。


在C++中,如果你想要为整个程序或某个特定作用域内的输出设置统一的格式,你可以通过修改流对象(如std::cout)的格式状态来实现。这些修改通常是临时的,除非你显式地保存并恢复这些状态,或者使用某些全局设置方法(尽管C++标准库并不直接提供全局设置所有输出的方法)。

以下是一些控制输出格式的方法,这些方法可以在一定程度上实现全局或持久化的效果:

  1. 使用std::ios_base的静态成员函数
    虽然std::ios_base提供了设置和获取格式状态的静态成员函数(如sync_with_stdio),但它们并不直接用于格式化输出。这些函数主要用于控制C++流与C标准I/O库之间的同步。

  2. 创建自定义的流对象
    你可以创建一个自定义的流对象,并设置其格式状态。然后,在你的程序中使用这个自定义的流对象进行输出。这种方法的好处是你可以在不同的作用域或模块中轻松地重用这些设置。

    #include <iostream>
    #include <iomanip>

    std::ostream& my_cout = std::cout; // 实际上,这里只是引用了std::cout
    // 或者,你可以创建一个stringstream或其他ostream派生类的对象

    int main() {
    // 设置自定义流的格式状态
    my_cout << std::fixed << std::setprecision(2);

    // 使用自定义流进行输出
    double num = 123.456789;
    my_cout << "Formatted output: " << num << std::endl;

    // 注意:这里my_cout实际上是std::cout的引用,所以它的设置会影响到std::cout
    // 如果你不想影响std::cout,应该创建一个独立的ostream对象

    return 0;
    }

    注意:在上面的例子中,my_cout实际上是std::cout的引用,所以对它所做的任何修改都会影响到std::cout。如果你想要一个独立的流对象,你应该创建一个std::ostringstream或其他std::ostream派生类的对象。

  3. 使用函数封装格式设置
    你可以编写一个函数,该函数接受一个流对象和必要的格式参数,并设置流对象的格式状态。然后,在你的程序中调用这个函数来设置输出格式。

    #include <iostream>
    #include <iomanip>

    void set_output_format(std::ostream& os, int precision = 2) {
    os << std::fixed << std::setprecision(precision);
    }

    int main() {
    set_output_format(std::cout);

    double num = 123.456789;
    std::cout << "Formatted output: " << num << std::endl;

    return 0;
    }
  • 标题: iomanip头文件
  • 作者: 晨曦
  • 创建于 : 2024-10-15 11:30:53
  • 更新于 : 2024-11-12 08:57:06
  • 链接: https://blog.starlit.icu/2024/10/15/c⁄c++/iomanip说明/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论