zoukankan      html  css  js  c++  java
  • 【C++】C++中的流

    目录结构:

    contents structure [-]

    1.IO类

    除了istream和ostream之外,标准库还定义了其它的一些类型。如下表:

    头文件 类型
    iostream

    istream,wistream 从流读取数据

    ostream,wostream 向流写入数据

    iostream,wiostream 读写流

    fstream

    ifstream,wifstream 从文件读取数据

    ofstream,wofstream 向文件写入数据

    fstream,wfstream 读写文件

    sstream

    istringstream,wistringstream 从string读取数据

    ostringstream,wostringstream 向string写入数据

    stringstream,wstringstream 读写string


    为了支持宽字符的语言,标准库还定义了一组类型和对象来操作wchar_t类型的数据。宽字符版本和函数的名字以一个w开始。例如,wcin,wcout和cerr,分别对应cin,cout,cerr的宽字符版本。

    下面这种图片更详细的列举了,c++中流的基本体系:

    1.1 IO对象无拷贝状态

    不能拷贝和对IO对象赋值:

    fstream out1,out2;
    out1 = out2; //错误,不能对流对象赋值
    ofstream print(ofstream); //错误,不能初始化ofstream参数
    out2 = print(out2); //错误,不能拷贝流对象

    由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为流类型。进行IO操作的函数通常以引用的方式传递和返回流。

    1.2 条件状态

    C++类提供了一些列的函数和标志,可以帮助我们访问和操纵流的条件状态,下表列举了一些函数和标志:

    strm::iostate strm流的iostate类静态成员,提供了表达式状态的完整功能
    strm::badbit strm流的badbit类静态成员,指出流已经崩溃
    strm::failbit strm流的failbit类静态成员,指出流操作失败了
    strm::eofbit strm流的eofbit类静态成员,指出流达到了文件末尾
    strm::goodbit strm流的goodbit类静态成员,指出流处于正常状态,未发生任何错误
    s.eof() 若流s的eofbit置位,则返回true
    s.fail() 若流s的failbit或badbit置位,则返回true
    s.bad() 若流s的badbit置位,则返回true
    s.good() 若流s处于有效状态,则返回true
    s.clear() 将流s中的所有条件状态位复位,将流的状态设置为有效。
    s.clear(flags) 根据给定的flags标志位,将流s中对应的条件状态位复位。flags的类型是strm::flags
    s.setstate(flags) 根据给定的flags标志位,将流s中的对应条件状态位置位。flags的类型是strm::flags
    s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate。


    我们可以使用如下的代码判断流的状态:

    std::ifstream strm;
    if(strm.good()){
        //继续操作
    }

    由于流重载了布尔运算符,

    explicit operator bool() const;

    如果failbit和badbit被置位,则返回false。否则返回true。

    有了布尔运算符,我们就可以轻松的判断流的状态。

      std::ifstream is;
      is.open ("test.txt");
      if (is) { //编译器会编译为if(is.good())
        // 操作文件
      }
      else {
        std::cerr << "Error opening 'test.txt'
    ";
      }

    2.文件流

    头文件fstream定义了三个类型来支持文件IO,ifstream从一个给定的文件读取数据,ofstream从一个向一个给定的文件写入数据,以及fstream可以读写文件。

    读写文件的步骤:
    1.创建文件流对象
    2.打开文件
    3.读写数据
    4.关闭文件

    例如:

    #include <fstream>      // std::fstream
    
    int main () {
      std::fstream fs;//创建对象
      fs.open ("test.txt");//打开文件
      fs << " more lorem ipsum";//写入数据
      fs.close();//关闭文件
      return 0;
    }

    2.1 文件模式

    每个流都有一个关联的模式,用来指出如何使用文件。例如:

    in 以读的方式打开
    out 以写的方式打开
    app 每次写操作前均定位到文件末尾
    ate 打开文件立即定位到文件末尾
    trunc 截断文件
    binary 以二进制方式进行


    当打开一个文件的时候,可以指定一个文件模式,指定模式有如下限制:
    1.只可以对ofstream或fstream对象设定out模式
    2.只可以对ifstream或fstream对象设定in模式
    3.只有当out模式被设定时才可以设定trunc模式
    4.只要trunc没有被设定,就可以设定app模式。在app模式下,即使没有显式指定out模式,文件也总是以输出方式打开。
    5.默认情况下,即使我们没有指定trunc模式,以out模式打开的文件也会被截断。为了保留以out模式打开的文件的内容,我们必须同时指定app模式,这样只会将数据追加到文件末尾;或者同时指定in模式,即打开文件同时进行读写操作
    6.ate和binary模式可以用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。

    每个文件流都有一个默认的文件模式,ifstream关联的文件默认以in模式打开,ofstream关联的文件默认以out模式打开,fstream关联的文件默认以in和out模式打开。

    例如:

    ofstream out; // 未指定文件打开模式
    out.open("test.txt"); // 模式隐含设置为输出和截断
    out.close(); // 关闭out
    out.open("test2.txt",ofstream::app); //模式为输出和追加
    out.close(); //关闭out 

    3.string流

    sstring头文件定义了三个类型来支持内存IO操作,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。

    istringstream从string读取数据,ostringstream向string写入数据,stringstream既可以向string写入数据也可以向string读取数据。

    下面是关于stringstream的常规操作:

    sstream strm 是一个未绑定的stringstream对象
    sstream strm(s) strm是一个stringstream对象,保存了string s的拷贝。
    strm.str() 返回strm所保存的string的拷贝
    strm.str(s) 将string s拷贝到stream中



    例如:

    #include <string>       // std::string
    #include <iostream>     // std::cout
    #include <sstream>      // std::stringstream, std::stringbuf
    
    int main () {
      std::stringstream ss; //创建stringstream对象
    
      ss.str ("Example string"); //将字符串拷贝到stringstream中
    
      std::string s = ss.str(); //获得stringstream中保存的字符串
      std::cout << s << '
    '; //输出
    
      std::string word;
      while(ss >> word)//从stringstream中读取每一个单词
        std::cout << word << '
    ';
    
      std::cout << std::endl;
      return 0;
    }






  • 相关阅读:
    [转] iphoneX、iphoneXS、iphoneXSMax、iphoneXR适配
    [转] 以 async/await 为例,说明 babel 插件怎么搭
    [转] 使用Node.js实现简易MVC框架
    [转] vue异步处理错误
    [转] 谈谈前端异常捕获与上报
    everything 13问
    Mysql 工具mysqlbinlog
    Mysql 删除日志
    Mysql 错误 ERROR 1 (HY000) at line 1: Can't create/write to file '/home/kaizenly/cfg_dict.csv' (Errcode: 13
    Mysql 问题集
  • 原文地址:https://www.cnblogs.com/HDK2016/p/10705871.html
Copyright © 2011-2022 走看看