C++ IO库初探

C++ IO库

  1. IO对象没有拷贝与赋值:由于无法拷贝IO对象,所以函数的形参和返回类型不能是IO对象,一般我们使用引用来传递和返回流
  2. IO库的三种头文件iostream,fstream,sstream

条件状态

*  IO的错误可能发生在系统深处,所以以下的函数和标志用来访问和操作流的条件状态 

strm::iostate //提供表达条件状态的完整功能
strm::badbit  //用来指出流已经崩溃 发生了系统级错误
strm::failbit //用来表示一个IO操作已经失败 发生的是可恢复错误
strm::eofbit  //用来指示流到了文件结束
strm::goodbit //用来指出流未处于错误状态,此值保证为0
s.eof()     //若流s的eofbit位置,返回true
s.fail()        //流s在failbit和bidbit位置上返回true
s.bad()     //流在badbit位置上返回true
s.good()        //若流处于有效状态返回true
s.clear()       //将s中的所有条件状态复位,将流状态设置为有效返回void
s.clear(flags)//根据给定的flags标志位将流中对应的条件状态位 复位, falgls是strm::iostate类型,返回void
s.setstate(flags)//根据给定的flags将中对应的状态位置位
s.rdstate() //返回s当前状态,返回类型strm::iostate

分析下段代码

auto old_state = cin.rdstate();
cin.clear();
process_input(cin);
cin.setstate(old_state);

先让old_state记住当前cin状态,后将cin置为有效,最后用old_state来将cin复位。

管理输出缓冲

*   endl 输出回车并刷新缓冲区,flush 仅仅刷新缓冲区,ends 输出一个空字符并刷新缓冲区
* `cout << unitbuf;`所有输出操作都会立即刷新缓冲区
* `cout << nounbuf;`回到正常缓冲方式
* cin 和 cout 是关联的,所以从输入流读取数据会导致刷新关联的输出流
* 关联函数tie()有两个版本,第一个不带参数,返回指向输出流的指针。第二个版本接受一个指向ostream的指针,将自己关联到这个ostream

文件输入输出

fstream fstrm;      //创建一个未绑定的文件流。fstream是头文件fstream中定义的一个类型
fstream fstrm(s);       //创建一个fstrm并打开文件s,s可以是string类型也可以是c风格的字符串指针。这些构造函数都是explicit的
fstream fstrm(s,mode);//mode依赖于fstream的类型
fstrm.open(s)           //打开文件s,并且和fstrm绑定
fstrm.close()           //关闭fstrm
fstrm.is_open()     //指出和fstrm关联的文件是否打开成功并且尚未关闭

使用文件流对象

* 实现文件每行读入,每个单词读入的方式

#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
using std::vector;
using std::string;
using std::ifstream;
using std::endl;
using std::cout;

void ReadFileToVec(const string &File, vector<string> &kk){
    ifstream ifs(File);
    if(ifs){                         //检查open是否成功
        string buf;
        while(getline(ifs,buf)){        //每行读入
        //while(ifs>>buf)是每个单词读入
            kk.push_back(buf);
        }
    }
    return;
}

int main()
{
    vector <string> vec;
    ReadFileToVec("in.txt",vec);
    for(const auto &s:vec){
        cout << s << endl;
    }
    return 0;
}

文件模式

流都有一个关联的文件模式

1. in 读方式;out 写方式;app 每次写操作均定位到文件末尾;ate 打开文件后立即定位到文件末尾,trunc 截断文件;binary 以二进制方式IO
2. 以out形式打开文件(意味着同时使用trunc模式),文件的内容会被丢弃。解决此类问题的方式是显示指定app或者in模式。
`ofstream out3("file1",ofstream::out|ofstream::app);`

string流

sstream strm;       //未绑定的stringstream对象
sstream strm(s);
strm.str()      //返回strm所保存的string的拷贝
strm.str(s)     //将s拷贝到strm中

#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
#include <sstream>
using std::vector;
using std::string;
using std::ifstream;
using std::endl;
using std::cout;
using std::istream;
using std::istringstream;

bool ReadFileToVec(const string &File, vector<string> &kk){
    ifstream ifs(File);
    if(ifs){                         //检查open是否成功
        string buf;
        while(getline(ifs,buf)){
        //while(ifs >> buf)    
            kk.push_back(buf);
        }
    }
    else{
        cout << "No data." << endl;
        return false;
    }
    return true;
}

istream &func(istream &is){
    string buf;
    while(is >> buf){
        cout << buf << endl;
    }
    is.clear();
    return is;
}

int main()
{
    vector <string> vec;
    if(ReadFileToVec("in.txt",vec)){
        /*for(const auto &s:vec){
            cout << s << endl;
        }*/
        for(auto &s :vec){
            istringstream iss(s);
            string outf;
            while(iss >> outf)
                cout << outf << endl;
        }
    }
    //将istringstrem一个一个单词输出
    istringstream iss("h hh hhh .");
    func(iss);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值