zoukankan      html  css  js  c++  java
  • VC++ 之 输入/输出流类库

      在C++中,数据从一个对象到另一个对象的传送被抽象为“流”,由它负责在数据的产生者和使用者之间建立联系,并管理数据的流动。
    在现代操作系统中,一切输入/输出设备,包括键盘、显示器、打印机、网卡、磁盘、声卡等,都被视为广义的文件。在C++中,与这些文件的交互,即数据的输入/输出,是通过包含在C++标准库里的输入/输出(I/O)流类库来实现的。

      C++的基本流类体系

      流类体系

    整个流类体系是一个派生类体系,如下图所示。


    图 输入/输出流类派生体系


    按ANSI C++标准,类ios是抽象类,它的析构函数是虚函数,它的构造函数为保护的,作为所有基本流类的基类。VC++中有一个构造函数ios (streambuf*)为公有,与ANSI C++不同。

    在流类库中,最重要的两部分功能为标准输入/输出(standard input/output)和文件处理。

    在C++的流类库中定义了四个全局流对象:cin,cout,cerr和clog。可以完成人机交互的功能。

    • cin:标准输入流对象,键盘为其对应的标准设备。带缓冲区的,缓冲区由streambuf类对象来管理。
    • cout:标准输出流对象,显示器为标准设备。带缓冲区的,缓冲区由streambuf类对象来管理。
    • cerr和clog:标准错误输出流,输出设备是显示器。为非缓冲区流,一旦错误发生立即显示。


    要使用这四个功能,必须包含<iostream.h>文件。

    提取运算符“>>”(stream_extraction operator)和插入运算符“<<”(stream_insertion operator),执行输入/输出操作。

    • “提取”的含义是指输入操作,可看作从流中提取一个字符序列。
    • “插入”的含义是指输出操作,可看作向流中插入一个字符序列。


    文件处理完成永久保存的功能。在VC++的MFC编程中采用了序列化(Serialization)。

     C++输入输出的格式控制

     C++在类ios中提供格式化输入输出。

    格式控制符

    使用格式控制符,可以进行格式化输入输出。这些格式对所有文本方式的输入输出流均适用。

    格式控制符定义为公有的无名的枚举类型:
    enum{
           skipws=0x0001, //跳过输入中的空白字符
           left=0x0002, //输出左对齐
           right=0x0004, //输出右对齐
           internal=0x0008, //在输出符号或数制字符后填充
           dec=0x0010, //在输入输出时将数据按十进制处理
           oct=0x0020, //在输入输出时将数据按八进制处理
           hex=0x0040, //在输入输出时将数据按十六进制处理
           showbase=0x0080, //在输出时带有表示数制基的字符
           showpoint=0x0100, //输出浮点数时,必定带小数点
           uppercase=0x0200, //输出十六进制,用大写
           showpos=0x0400, //输出正数时,加”+”号
           scientific=0x0800, //科学数方式输出浮点数
           fixed=0x1000, //定点数方式输出实数
           unitbuf=0x2000, //插入后,立即刷新流
           stdio=0x4000 //插入后,立即刷新stdout和stderr
    }

    该枚举量说明中的每一个枚举量,实际对应两字节数据(16位)中的一个位,所以可以同时采用几个格式控制,只要把对应位置1即可,这样既方便又节约内存。

    取多种控制时,用或“|”运算符来合成,合成为一个长整型数,在ios中为:
    protected:
          long x_flags;

    配合使用的格式控制标志

    protected:
           int x_precision; //标志浮点数精度,默认为6位
           int x_width; //输出域宽,默认域宽为0,
                  //重设域宽只对其后第一输出项有效,如域宽不足,则不受限制
           char x_fill; //标志域宽有富余时填入的字符

      例1:整型数输出。 

    #include<iostream>
    using namespace std;
    int main(void){
        int inum=255;
        cout<<"十进制方式"<<inum<<'	';
        cout.flags(ios::oct|ios::showbase);//八进制带数制基输出是前面加0;参数等效0x00a0
        cout<<"八进制方式"<<inum<<'	';
        cout.setf(ios::hex);               //等效0x0040,因是或关系,仍带基输出,格式为0x...
        cout<<"十六进制方式"<<inum<<endl;
        return 0;
    }

      例2:浮点数输出

    #include<iostream>
    using namespace std;
    
    int main(){
        double fnum=31.415926535;
        cout<<"缺省域宽为:"<<cout.width()<<""<<'
    '; 
        cout<<"缺省精度为:"<<cout.precision()<<""<<'
    ';  //floatfield为0x1800
        cout<<"缺省表达方式:"<<fnum<<'
    ';       //按值大小,自动决定定点还是科学数方式
        cout.setf(ios::scientific,ios::floatfield);        //floatfield为0x1800
        cout<<"科学数表达方式:"<<fnum<<'
    ';
        cout.setf(ios::fixed,ios::floatfield);            //设为定点,取消科学数方式
        cout<<"定点表达方式:"<<fnum<<'
    ';
        cout.precision(9);                                //精度为9位,小数点后9位
        cout.setf(ios::scientific,ios::floatfield); 
        cout<<"9位科学数表达方式"<<fnum<<'
    ';
        return 0;
    }

    流操作子(setiosflags stream manipulator)

      流格式控制成员函数的使用比较麻烦,可改用流操作子(Setiosflags Stream Manipulator)。例如setw()等,可代替流类中的格式控制成员函数。
      注意,绝大多数流操作子仅适用于新的C++标准流类库(头文件不带.h),常用流操作子如下表所示。

    cin,cout和clog都是缓冲流。对输出而言,仅当输出缓冲区满才将缓冲区中的信息输出,对输入而言,仅当输入一行结束,才开始从缓冲区中取数据,当希望把缓冲区中的信息立即输出,可用flush,加endl也有同样功能,回车并立即显示,不必等缓冲区满(endl清空缓冲区)。

      例3:采用流操作子的浮点数输出

    #include<iostream>
    #include<iomanip>
    using namespace std;
    
    int main(){
        double fnum=31.415926535;
        cout<<"缺省域宽为:"<<cout.width()<<""<<'
    '; 
        cout<<"缺省精度为:"<<cout.precision()<<""<<'
    ';  //floatfield为0x1800
        cout<<"缺省表达方式:"<<fnum<<'
    ';       //按值大小,自动决定定点还是科学数方式
        cout<<"科学数表达方式:"<<scientific<<fnum<<'
    ';  //设为科学数方式
        cout<<"定点表达方式:"<<fixed<<fnum<<'
    ';         //设为定点,取消科学数方式
        cout<<"9位科学数表达方式"<<setprecision(9)<<scientific<<fnum<<'
    ';//精度9位指小数点后9位
        return 0;
    }
  • 相关阅读:
    两数组相比筛选数据
    利用Cache防止同一帐号重复登录
    [转]post与get的区别
    巧妙运用SQL Server保护数据
    华为任正非:让一线呼唤炮火(续)
    ASP.NET到底该从哪开始学起?
    C# 4.0中泛型协变性和逆变性详解
    服装库存积压的解决路径
    Spring3 MVCx学习 skyCc
    Hibernate缓存(转述) skyCc
  • 原文地址:https://www.cnblogs.com/delphi2014/p/4070627.html
Copyright © 2011-2022 走看看