• ostream类方法


    概要:

    • ios_base类表示流的一般特征,如是否可读取、是二进制流还是文本流等;
    • ios类基于ios_base,其中包括了一个指向streambuf对象的指针成员;
    • streambuf类为缓中区提供了内存,并提供用于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法;
    • ostream 类是从ios 类派生而来的,提供了输出方法;
    • istream类也是从ios类派生而来的,提供了输入方法;
    • iostream类是基于istream和ostream类的,因此继承了输入方法和输出方法。

      1.ostream类的类方法

    • 重载的<<运算符

      ostream类重新定义了<<运算符,方法是将其重载为输出。在这种情况下,<<叫做插入运算符,插入运算符被重载,使之能够识别c++中所有的基本类型。

      原型:ostream & operator<<(Type);

      函数返回一个指向ostream对象的引用,这使得可以将输出连接起来。

    • put()方法

      原型:ostream & put(char);

      用于显示字符,可以用类方法表示法来调用它:

      cout.put('W');

      和<<运算符一样,该函数也返回一个指向调用对象的引用,因此可以用它将拼接输出:

      cout.put('w').put('t');

    • write()方法

      模板原型:basic_ostream<charT,traits> & write(const char_type* s,streamsize n);

      write()的第一个参数提供了要显示的字符串的地址,第二个参数指出要显示多少个字符,使用cout调用write()时,将调用char具体化,因此返回类型为ostream&,

      这使得可以将输出拼接起来。

      write()方法并不会在遇到空字符时自动停止打印字符,而只是打印指定数目的字符,即使超出了字符串的边界。

    • 刷新输出缓冲区

      控制符flush刷新缓冲区,而控制符endl刷新缓冲区,并插入一个换行符。这两个控制符的使用方式与变量名相同:

      cout<<"Hello"<<flush;

      cout<<"world"<<endl;

      控制符也是函数,可以直接调用flush()来刷新cout缓冲区:

      flush(cout);

      然而,ostream类对<<运算符进行了重载,所以可用下述表达式替换函数调用:

      cout<<flush;

      因此可以用更为方便的插入表示法来成功地进行刷新。

    • 用cout进行格式化

      1.修改显示时使用的计数系统

        要控制整数以十进制、十六进制还是八进制显示,可以使用dec、hex和oct控制符。

        例如,下面的函数调用将cout 对象的计数系统格式状态设置为十六制:
        hex (cout) ;

        完成上述设置后,程序将以十六进制形式打印整数值,直到将格式状态设置为其他选项为止。

        注意,控制符不是成员函数,因此不必通过对象来调用。

        虽然控制符实际上是函数,但它们通常的使用方式为:

        cout<<hex;

      2.调整字段宽度

        可以使用width成员函数将长度不同的数字放到宽度相同的字段中,该方法的原型为:
        int width() ;
        int width(int i) ;
        第一种格式返回字段宽度的当前设置:第二种格式将字段宽度设置为 i个空格,并返回以前的字段宽度值。这使得能够保存以前的值,以便以后恢复宽度值时使用。
        width()方法只影响将显示的下一个项目,然后字段宽度将恢复默认值。

        使用方法如:cout.width(5);

      3.填充字符

        在默认情况下,cout用空格填充字段中未被使用的部分,可以用fill()成员函数来改变填充字符。(cout输出时默认右对齐)

        例如,下面的函数调用将填充字符改为星号:

        cout.fill('*');

      4.设置浮点数的显示精度

        浮点数精度的含义取决于输出模式。有三种模式:默认模式、定点模式和科学模式。

        在默认模式下,它指的是显示的总位数。在定点模式和科学模式下,精度指的是小数点后面的位数。已经知道, C+的默认精度为6位(但未尾的0将不显示)。

        precision( )成员函数使得能够选择其他值。例如,下面语句将cout的精度设置为2:

          cout.precision(2) ;

        和width()的情况不同,但与fill()类似,新的精度设置将一直有效,直到被重新设置。
      5.打印末尾的0和小数点

        ios_base类提供了一个setf()函数,能够控制多种格式化特性。这个类还定义了多个常量,可用作该函数的参数。

          下面的函数调用使cout显示末尾小数点:

        cout.setf(ios_base::showpoint);

        使用默认的浮点格式时,上述语句还将导致末尾的0被显示出来。

      6.setf()函数

        setf()函数有两个原型。第一个为:

        fmtflags  setf(fmtflags);

           其中fmtflags是bitmask类型的typedef名,用于存储格式标记。该名称是在ios_base类中定义的。

        这个版本的setf()用来设置单个位控制的格式信息,参数是一个fmtflags值,指出要设置哪一位。返回值是类型为fmtflags的数字,指出所有标记以前的设置,

        如果打算以后恢复原始设置,则可以保存这个值。

        ios_base类定义了代表位值的常量,使用时,必须加上作用域解析运算符。

    格式常量
    常量 含义
    ios_base ::boolalpha 输入和输出bool值,可以为true或false
    ios_base::showbase 对于输出,使用C++基数前缀(0, 0x)
    ios_base::showpoint 显示末尾的小数点
    ios_base::uppercase 对于16进制输出,使用大写字母,E表示法
    ios_base::showpos 在正数前面加上+

        第二个setf()原型接受两个参数,并返回以前的设置:

        fmtflags setf(fmtflags,fmtflags);

        函数的这种重载格式用于设置由多位控制的格式选项。第一参数和以前一样,也是一个包含了所需设置的fmtflags值。第二参数指出要清除第一个参数中的哪些位。

    setf(long,long)的参数
    第二个参数 第一个参数 含义
    ios_base::basefield  ios_base::dec  使用10进制
    ios_base::oct  使用8进制
    ios_base::hex  使用16进制
    ios_base::floatfield ios_base::fixed  使用定点计数法(即一般计数法)
    ios_base::scientific  使用科学计数法
    ios_base::adjustfield  ios_base::left  左对齐
    ios_base::right  右对齐
    ios_base::internal  符号或基数前缀左对齐,值右对

      在C++标准中,定点表示法和科学表示法都有下面两个特征:

    • 精度指的是小数位数, 而不是总位数:
    • 显示末尾的0。

       调用setf()的效果可以通过unsetf()消除,后者的原型为:

      void unsetf(fmtflags mask);

      其中,mask是位模式,mask中所有的为都设置为1,将使得对应的位被复位。

      您可能注意到了,没有专门指示浮点数默认显示模式的标记,系统的工作原理如下:仅当只有定点位被设置时使用定点表示法;仅当只有科学位被设置时使用科学表示法;

      对于其他组合,如没有位被设置或两位都被设置时,将使用默认模式。因此,启用默认模式的方法之如下:
      cout.setf(0, ios_base::floatfield);

      第二个参数关闭这两位,而第一个参数不设置任何位。一种实现同样目标的简捷方式是,使用参数is:floatfield来调用函数unsetf( ):

      cout .unsetf (ios_ base: :floatfield);

      如果已知cout处于定点状态,则可以使用参数ios_base:fixed 调用函数unsetf( )来切换到默认模式;然而,无论cout的当前状态如何,使用参数ios_base:floatfield 调用函数unsetf( )  

      都将切换到默认模式,因此这是一种更好的选择。

      7.标准控制符

      如:下面的语句打开左对齐和定点模式:

        cout<<left<<fixed;

      8.头文件iomanip

      C++在头文件iomanip中提供了其他一些控制符,三个最常用的控制符为setprecision()、setfill()、setw(),它们分别用来设置精度、填充字符和字段宽度。

      setprecision( )控制符接受一个指定精度的整数参数;

       sefill( )控制符接受一个指定填充字符的char参数;

       setw( )控制符接受一个指定字段宽度的整数参数。

      由于它们都 是控制符,因此可以用cout语句连接起来。这样,setw( )控制符在显示多列值时尤其方便。





     




  • 相关阅读:
    Storm中的定时任务
    Storm的acker确认机制
    ORACLE数据库表解锁record is locked by another user
    Java生成某段时间内的随机时间
    Linux中断概述
    Linux内核同步:RCU
    Linux内核同步:自旋锁
    Linux软中断、tasklet和工作队列
    Linux信号机制
    缺页异常处理
  • 原文地址:https://www.cnblogs.com/zhi321/p/12048617.html
Copyright © 2020-2023  润新知