- <iomanip> 是 C++ 标准库中的一个头文件,它提供了对输入/输出流的格式化操作。
- iomanip 库中的函数允许开发者控制输出格式,如设置小数点后的位数、设置宽度、对齐方式等。
- iomanip 是 Input/Output Manipulators 的缩写,它提供了一组操作符,用于控制 C++ 标准库中的输入/输出流的格式。
iomanip 库中的函数通常与 << 和 >> 操作符一起使用,以实现对输出流的控制。以下是一些常用的 iomanip 函数:
- setw(int)
- setprecision(int)
- fixed
- scientific
- setiosflags(ios_base::fmtflags)
- resetiosflags(ios_base::fmtflags)
- setfill(char)
1. 设置宽度
使用 setw 可以设置输出的宽度。如果输出内容的字符数少于设置的宽度,剩余部分将用空格填充。
![](https://i-blog.csdnimg.cn/direct/861b553ba74c485ab16075b3630691ba.png)
2. 设置精度
作用:控制输出流显示浮点数的数字个数,setprecision(n)就是输出的n个数,会有四舍五入。
特别提示:
如果再在这些语句后面加三条语句:
第一条输出:1,不是浮点型。
第二条为:1.008,承接setprecision(8)的这条规则语句。
第三条也为:1,按整型输出
可见,小数部分末尾为0时,是输不出来的!要想输出来,就得用showpoint了。
语法:在输出语句前声明:
cout.setf(ios::showpoint);就行了!
如果想要保留几位小数,那setprecision就得与fixed合作了!!
语法:在输出语句前声明:
cout.setf(ios::fixed);
语句也可以写成:cout<<fixed<<setprecision(2)<<s<<endl;
就算后面的语句没有写<<fixed,同样会按有<<fixed处理。
比如有语句:
cout<<fixed<<setprecision(2)<<s<<endl;
cout<<setprecision(7)<<s<<endl; //A
cout<<setprecision(8)<<s<<endl; //B
AB语句均会按保留7个、8个小数处理,不会再按有7或8个浮点数处理。
如果下面有语句C: cout<<1.008<<endl; 也会保留8个小数。如下:
setprecision、showpoint与fixed混合使用
std::fixed
:这个操作符设置浮点数的输出格式为固定的小数点表示法,而不是科学计数法。然而,它本身并不控制小数点后的位数。如果你想要控制小数点后的位数,你需要与std::setprecision
结合使用。
std::showpoint
:这个操作符确保在输出浮点数时,即使末尾是0也会显示小数点。默认情况下,如果浮点数的小数部分全部为0,则不会显示小数点。
double s=20.7843909
1)有语句
cout<<setprecision(2)<<s<<endl;//输出21
cout<<fixed<<s<<endl;//输出20.78
2)有语句:
cout<<setprecision(2)<<s<<endl;//输出21
cout<<showpoint<<s<<endl;//输出21.(有个点)
3)有语句:
cout<<setprecision(2)<<s<<endl;//输出21
cout<<fixed<<s<<endl; //输出20.78
cout<<showpoint<<s<<endl;//输出20.78
4)有语句:
cout<<setprecision(2)<<s<<endl;//输出21
cout<<showpoint<<s<<endl;//21.(有个点)
cout<<fixed<<s<<endl;//20.78
3. 固定小数点和科学计数法
fixed 和 scientific 可以控制浮点数的输出格式。
4. 设置填充字符
使用 setfill 可以设置填充字符,通常与 setw 一起使用。默认情况下,如果输出宽度大于要输出的数据所需的宽度,并且没有指定填充字符,则大多数实现会使用空格作为填充字符。但是,通过使用 std::setfill
,你可以改变这个默认行为,使用任何你想要的字符作为填充。
5. 设置和重置格式标志
setiosflags 和 resetiosflags 可以设置或重置流的格式标志。
std::setiosflags
用于设置I/O流的一个或多个格式标志。它接受一个或多个std::ios_base::fmtflags
类型的参数,这些参数指定了要设置的标志。一旦设置了这些标志,它们将影响后续的I/O操作,直到被std::resetiosflags
或类似的操纵符重置。与
std::setiosflags
相反,std::resetiosflags
用于清除(重置)I/O流的一个或多个格式标志。它同样接受std::ios_base::fmtflags
类型的参数,但这次是用来指定哪些标志应该被清除。
例1:
例2:
注意:虽然在这个例子中std::setiosflags与std::ios::fixed和std::ios::showpoint一起使用,但std::setiosflags实际上可以接受任何std::ios_base::fmtflags的组合,并通过(|)操作符组合它们。
std::resetiosflags只会清除你明确指定的那些标志。在这个例子中,我们清除了std::ios::fixed标志,但保留了std::ios::showpoint标志