概述
public member type
std::ios_base::fmtflags
输入流格式标志
流格式标志的类型表示流格式标志的位掩码类型。
此类型由成员函数flags
、setf
和unset
用作其参数和/或返回值。
这些函数传递和检索的值可以是以下成员常量的任何有效组合:
// using ios_base::fmtflags
#include <iostream>// std::cout, std::ios_base, std::ios, std::hex, std::showbase
int main () {
// using fmtflags as class member constants:
std::cout.setf (std::ios_base::hex , std::ios_base::basefield);
std::cout.setf (std::ios_base::showbase);
std::cout << 100 << 'n';
// using fmtflags as inherited class member constants:
std::cout.setf (std::ios::hex , std::ios::basefield);
std::cout.setf (std::ios::showbase);
std::cout << 100 << 'n';
// using fmtflags as object member constants:
std::cout.setf (std::cout.hex , std::cout.basefield);
std::cout.setf (std::cout.showbase);
std::cout << 100 << 'n';
// using fmtflags as a type:
std::ios_base::fmtflags ff;
ff = std::cout.flags();
ff &= ~std::cout.basefield; // unset basefield bits
ff |= std::cout.hex; // set hex
ff |= std::cout.showbase; // set showbase
std::cout.flags(ff);
std::cout << 100 << 'n';
// not using fmtflags, but using manipulators:
std::cout << std::hex << std::showbase << 100 << 'n';
return 0;
}
0x64
0x64
0x64
0x64
0x64
代码显示了使用fmtflags成员常数及其同名操纵器打印相同结果的一些不同方式。
// skipws flag example
#include <iostream>// std::cout, std::skipws, std::noskipws
#include <sstream>// std::istringstream
int main () {
char a, b, c;
std::istringstream iss(" 123");
iss >> std::skipws >> a >> b >> c;
std::cout << a << b << c << 'n';
iss.seekg(0);
iss >> std::noskipws >> a >> b >> c;
std::cout << a << b << c << 'n';
return 0;
}
123
1
std::ios_base::setf
set (1) fmtflags setf(fmtflags fmtfl);
mask (2) fmtflags setf(fmtflags fmtfl, fmtflags mask);
设置特定的格式标志
第一种形式(1)设置流的格式标志,其位在fmtfl中设置,其余的保持不变,就像调用标志(fmtfl | flags())一样。
第二种形式(2)设置流的格式标志,其位在fmtfl和mask中都设置,并清除其位在mask中设置但不在fmtfl中的格式标志,就像调用标志((fmtfl&mask)|(flags()&~mask))。
两者都返回调用前流的格式标志值。
// modifying flags with setf/unsetf
#include <iostream>
int main () {
std::cout.setf(std::ios::hex, std::ios::basefield);// set hex as the basefield
std::cout.setf(std::ios::showbase);// activate showbase
std::cout << 100 << 'n';
std::cout.unsetf(std::ios::showbase);// deactivate showbase
std::cout << 100 << 'n';
return 0;
}
0x64
64
示例:
void file_it(ostream& os, double fo, const double fe[], int n) {
ios_base::fmtflags initial;
initial = os.setf(ios_base::fixed, ios_base::floatfield); // save initial formatting state
std::streamsize sz = os.precision(0);
os << "Focal length of objective: " << fo << " mmn";
os.precision(1);
os.width(12);
os << "f.l. eyepiece";
os.width(15);
os << "magnification" << endl;// 放大倍数
for (int i = 0; i < n; i++) {
os.width(12);
os << fe[i];
os.width(15);
os << int(fo / fe[i] + 0.5) << endl;
}
os.setf(initial, ios_base::floatfield); // restore initial formatting state
os.precision(sz);
}
Focal length of objective: 1800 mm(物镜焦距)
f.l. eyepiece magnification(目镜 放大倍数)
39.0 46
19.0 95
24.0 75
8.8 205
7.4 243
示例:
可能有一个方面让您恼火——数字的格式不一致。现在可以改进实现,但保持接口不变。ostream类包含一些可用于控制格式的成员函数。这里不做太详细的探索,只需修改方法setf()
(setf->Set Flags),便可避免科学计数法:
std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);// floatfield包含[定点表示法标记]和[科学表示法标记]
std::cout.precision(3);
以上代码第一行设置了cout对象的一个标记,命令cout使用定点表示法。同样,第二行语句致使cout在使用定点表示法时显示3位小数。
修改方法的实现时,不应影响客户程序的其他部分。上述格式修改将一直有效,直到你再次修改,因此它们可能影响客户程序中的后续输出。因此,show()函数应重置格式信息,使其恢复到自己被调用前的状态。为此,可以像下面这样,使用返回的值:
std::streamsize precision = std::cout.precision(3); // 保存先前的精度值
...
std::cout.presion(precision); // 重置为旧值
// 保存原始标记
std::ios_base::fmtflags originflag = std::cout.set(std::ios_base::fixed);
...
// 重置为保存的值
std::cout.set(originflag, std::ios_base::floatfield);
void Stock::show() {
using std::cout;
using std::ios_base;
// 设置格式为 #.###
ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);
std::streamsize prec = cout.precision(3);
cout << "Company: " << company << " Shares: " << shares << 'n';
cout << " Share Price:$" << share_val;
// 设置格式为 #.##
cout.precision(2);
cout << " Total Worth:$" << total_val << 'n';
// 重新存储原始格式
cout.setf(orig, ios_base::floatfield);
cout.precision(prec);
}
最后
以上就是清秀蜗牛为你收集整理的❥关于C++之std::ios_base::fmtflags/setf的全部内容,希望文章能够帮你解决❥关于C++之std::ios_base::fmtflags/setf所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复