❥关于C++之std::ios_base::fmtflags/setf

Posted itzyjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❥关于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 << " mm\\n";
	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);

以上是关于❥关于C++之std::ios_base::fmtflags/setf的主要内容,如果未能解决你的问题,请参考以下文章

❥关于C++之streambuf

❥关于C++之异常

❥关于C++之一些函数记录

❥关于C++之智能指针

❥关于C++之文件结尾及处理

❥关于C++之嵌套类