I/O 格式化标志


I/O 格式控制器〉可以对当时处理中的串流改变格式,如果想在程序进行过程中,始终维持指定的格式,可以使用格式标志,透过setfunsetf方法来设定与取消。

以下列出一些常用的格式标志:

  • ios::boolalpha: 将真与假以 true 与 false 显示
  • ios::dec:10 进制显示
  • ios::fixed:正常方式显示(非科学计数)
  • ios::hex:16 进制显示
  • ios::left:靠左
  • ios::oct:8 进制显示
  • ios::scientific:科学计数
  • ios::showbase:显示基底
  • ios::showpoint:显示小数点
  • ios::showpos:正数显示 +
  • ios::skipws:忽略空白字符
  • ios::uppercase:字母大写

可以一次设定一个格式标志,若要设定多个格式标志,可以使用|来连结,例如:

cout.setf(ios::showbase | ios::hex);

下面这个程序显示一些基本的格式标志作用:

#include <iostream> 
using namespace std; 

int main() { 
    cout.unsetf(ios::dec); // 取消 10 进制显示 
    cout.setf(ios::hex | ios::scientific); // 16 进制显示或科学计数显示 
    cout << 12345 << "  " << 100 << endl; 

    cout.setf(ios::showpos | ios::showpoint); // 正数显示 + 号且显示小数点 
    cout << 10.0 << ": " << -10.0 << endl; 

    return 0; 
}

执行结果:

3039  64
+1.000000e+01: -1.000000e+01

在程序中先解除了ios::dec格式标志,这个动作并不一定需要,但在某些编译器中,这个标志会覆盖其它的标志,先清除比较保险。

ios类的flags方法会返回目前串流的格式设定,如果传递参数给它,会设定指定的格式,并返回上一个格式设定:

fmtflags flags();
fmtflags flags(fmtflags);

想一次设定指定的格式标志,可以如下:

ios::fmtflags f = ios::showpos | ios::showbase | ios::oct | ios::right;
cout.flags(f);

下面这个程序可以用来测试串流的格式设定:

#include <iostream> 
using namespace std; 

void info(ios::fmtflags current, const ios::fmtflags &flag, const string &flagName) {
    if(current & flag) {
        cout << flagName << " on" << endl; 
    }
    else {
        cout << flagName << " off" << endl; 
    }
}

int main() { 
    cout.unsetf(ios::dec); 
    cout.setf(ios::oct | ios::showbase); 

    ios::fmtflags flags = cout.flags(); 

    info(flags, ios::left, "left");
    info(flags, ios::dec, "dec");
    info(flags, ios::showbase, "showbase");
    info(flags, ios::oct, "oct");

    return 0; 
}

执行结果:

left off
dec off
showbase on
oct on




展开阅读全文