C++ primer 第八章笔记 初稿

8.1 IO类

不同的IO处理操作,分别定义在三个独立的头文件中:

头文件 类型
iostream istream, wistream 从流读取数据
iostream ostream, wostream 向流写入数据
iostream iostream, wiostream 读写流
fstream ifstream, wifstream 从文件读取数据
fstream ofstream, wofstream 向文件写入数据
fstream fstream, wfstream 读写文件
sstream istringstream, wistringstream 从 string读取数据
sstream ostringstream, wostringstream 向string写入数据
sstream stringstream, wstringstream 读写string

其中,iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。宽字符的类型与函数以w开头。

ifstreamistringstream均继承istream,故cin等方法一样适用于ifstreamistringstream

1. IO对象不能被拷贝,故不存在流类型的形参与返回类型,只能有引用的形式。

2. 条件状态

重要对象/方法 说明
iostate 机器相关的类型,指示流的条件状态
badbit 流已崩溃
failbit IO操作失败
s.fail() 若处于failbit 或 badbit,则为true
eofbit 已经到达文件结尾
s.eof() 若处于 eofbit,则为true
goodbit 没毛病
s.clear() 条件状态复位,返回类型void
s.clear(flag) 条件状态回复到flag,返回类型同上
s.setstate(f) 条件状态设置为f
s.rdstate() 返回当前条件状态,类型为iostate
int main(){
    int a;
    while(cin>>a)
        cout<<a<<endl;
    return 0;
}

一个简易的输入检查

3. IO库定义了四个iostate类型的constexpr值,用于表示特定的位模式,本质上只有goodfail

goodbit:0000 0000;
badbit :0000 0001;
eofbit :0000 0010;
failbit:0000 0100;

4. 管理条件状态

cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);

5. 管理输出缓冲

  • 每个输出流都管理一个缓冲区
  • 缓冲区刷新有如下导致因素
    • 程序正常结束
    • 缓冲区已满
    • endl等显示刷新缓冲区
    • 设置为unitbuf
    • 输出流与另一个流相关联,且被关联的流发生读写操作
  • 显示刷新缓冲区的三种方法
    • flush——不附加任何字符
    • endl——附加一个换行
    • ends——附加一个空字符
  • unitbuf——每次输出都刷新缓冲区
  • tie函数
    • 无参数:返回指向输出流的指针
    • 有参数:实现关联(x.tie(&o))

8.2文件的输入输出

1. 基本信息

  • 头文件:fstream

  • 包含类型:

    • ifstream: 文件写入数据
    • ofstream:读取文件数据
    • fstream: 读写指定文件
  • 成员
    • 继承自iostream中的方法
    • fstream f(s): 创建一个fstream对象,关联s文件,s为string或char*,此时open()会被自动调用
    • fstream f(s,mode): 以mode指定打开文件的方式
    • f.open(s): 显示关联s并打开该文件
    • f.close(): 关闭流
    • f.is_open(): 反应文件是否成功打开且为关闭

2. 文件模式 (mode)

模式名 含义
in 以读的方式打开
out 以写的方式打开
app 从文件末尾开始写
ate 打开文件时定位到末尾
trunc 截断文件
binary 二进制读写
  • 设定out后才可以设定trunc
  • 设定为trunc后不可以设定app
  • out trunc无须显式设定
  • 设定为app模式可保护被open文件的原有内容

3. 使用实例

  • 复制文件
#include <iostream>
#include <istream>
#include <fstream>
#include <cstring> 
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    ifstream input;
    ofstream output("text2.txt");
    string s;
    input.open("text1.txt");
    if(input){
        while(input>>s){
            output<<s<<" ";
            cout<<s<<endl;
        }
    }

    return 0;
}

如果调用open失败,或在关闭已经打开文件的文件流前调用open,failbit置位。
如果一个文件流到达作用域末尾,则自动调用close()。

8.3 string 流

1. 基本信息

  • 头文件: sstream
  • 父类:: iostream
  • 包含类型:

    • istringstream
    • ostringstream
    • stringstream
  • 成员

    • sstream st(s):创建一个与s串相关联的字符串流对象
    • st.str():返回s串
    • st.str(s):将字符串流与s串相关联

你可能感兴趣的:(C++-Primer)