我是靠谱客的博主 清秀蜗牛,最近开发中收集的这篇文章主要介绍❥关于C++之std::ios_base::fmtflags/setf,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

public member type
std::ios_base::fmtflags
输入流格式标志
流格式标志的类型表示流格式标志的位掩码类型。
此类型由成员函数flagssetfunset用作其参数和/或返回值。
这些函数传递和检索的值可以是以下成员常量的任何有效组合:

// 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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部