STL(三)C++ I/O流技术

    C++标准模板库中,提供了一组模板类和相应的具现类,来支持面向对象的数据输入输出功能,如基本的输入输出流istream类/ostream类/iostream类和文件输入输出流ifstream类/ofstream类/fstream类等。

一、I/O流类

  使用C++的I/O流类,需要用宏语句"#include " or "#include "。

  由于支持单字节和多字节的字符数据读写,C++通过模板类来定制I/O流类

  如下图:

  1. 首先是最底层的模板类basic_streambuf,具有基本的缓存处理功能。其他模板类是basic_streambuf类的友员类,以利用它的底层读写功能进行操作。
  2. 接下来是ios_base类,提供基本的读写格式设置,读写状态和错误检测功能,是一个非模板类,其他模板类实际是从它派生出来。
  3. basic_ios在ios_base类基础上将字符特性考虑进来,提供基本的字符数据输入输出处理。
  4. basic_istream, basic_ostream以及同时支持读写的basic_iostream,提供更确切的流数据的读写功能
  5. 用于文件数据读取的basic_ifstream,数据写入的basic_ofstream以及可读写的basic_fstream,并使用了basic_streambuf模板类进行缓冲处理
  6. C++通过具现以上I/O流的模板类,提供了便于应用的单字节和多字节的I/O流类,包括单字节的流类ios,istream,ostream,iostream,ifstream,ofstream and fstream,多字节的流类wios,wistream,wostream,wiostream,wifstream,wofstream and wfstream。

STL(三)C++ I/O流技术_第1张图片

二、标准输入输出

    为简化控制台的键盘和屏幕I/O处理,C++提供了4个内建的单字节处理的流对象cin(默认键盘输入), cout(默认屏幕输出), cerr(标准错误输出流对象,默认屏幕) and clog(带缓冲的标准日志输出流对象,默认屏幕), 以及对应的4个双字节处理的流对象wcin, wcout, wcerr and wclog

    这些内建流对象在程序执行时就被分别调用istream and ostream流类的函数进行创建和初始化,并作用于早已由C提供出来的充当文件指针的stdin标准输入,stdout标准输出、stderr标准错误。

三、文件输入输出

   文件读写所用到的很多常数都在基类ios中被定义出来。

(1)文件 打开:二进制模式按字节进行读写,不作任何数据转换,数据不会丢失

(2)文件 关闭:

(3)文件读写:1、利用重载操作符“<<”和“>>”读写;2、读写一个字符,ifstream& get(char& c),oftream& put(char& c);3、读写多个字符,read and write;4、随机读写,seekg and seekp,可移动文件的读写指针来读写。

四、流的格式控制

    对于流数据的输入输出模式,C++提供两种不同的控制方式,一种是使用ios_base类提供的setf, width等,另一种是操作符“<<”和“>>”以及流模式控制对象

(1)用函数设置或复位格式:查看fmtflags  setf(fmtflags  flag)函数的使用

#include 
using namespace std;
int main(void) {
    //科学计数方式显示,大写“E“
    cout.setf(ios::scientific | ios::uppercase);
    cout << 2006.5 << endl;    //2.006500E + 03
    return 0;
}
(2)用重载“<<”或“>>”操作符设置流格式

//使用流格式控制对象
#include 
#include 
using namespace std;
int main(void) {
    //设置域宽
    cout << setw(20) << "hello" << endl;
    //设置精度
    cout << setprecision(4) << 2006.536 << endl;
    //设置填充字符
    cout << setw(2) << setfill('*') << "baby" << endl;
    cout << scientific << 300.89 << endl;
    cout << oct << 9 << endl;
    cout << dec << showpos << 173 << endl;
    //取消正号显示
    cout << noshowpos << 192 << endl;
    cout << boolalpha << true << endl;
    return 0;
}

小结:C++提供了十分完善的流类和内建的流对象,支持面向对象的设备IO操作。

参考<<C++ STL技术开发引导>>





你可能感兴趣的:(STL(三)C++ I/O流技术)