c++primer 第八章(未完)

IO库
    c++语言不直接处理输入输出,而是通过一族定义在标准库中的类型来处理IO。这些类型支持从设备读取数据,向设备写入数据的IO操作,设备可以是文件、控制台窗口等
    istream(输入流)类型,提供输入操作
    ostream (输出流)类型,提供输出操作
    cin,一个istream对象,从标准输入读取数据
    cout,一个ostream对象,向标准输出写入操作
    cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误
    >>运算符,用来从一个istream对象读取输入数据
    <<运算符,用来向一个ostream对象写入输出数据
    getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中
IO类
    IO对象无拷贝或赋值(不能进行任何拷贝和赋值操作)
        进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的
    条件状态
        IO 操作一个与生俱来的问题是可能发生错误。一些错误是可恢复的,而其他错误则发生在系统深处,已经超出了程序可以修正的范围
                                                        IO库的条件状态
            strm::iostate                    strm是一种IO类型。iostate是一种机器相关的类型,提供了表达条件状态的完整功能
            strm::badbit                     strm::badbit用来指出流已崩溃
            strm::failbit                    strm::failbit用来指出一个IO操作失败了
            strm::eofbit                     strm::eofbit用来指出流到达了文件结束
            strm::goodbit                    strm::goodbit用来指出流末处于错误状态。此值保证为零
            s.eof()                          若流s的eofbit置位,则返回true
            s.fail()                         若流的failbit或badbit置位,则返回true
            s.bad()                          若流的badbit置位,则返回true
            s.good()                         若流s处于有效状态,则返回true
            s.clear()                        将流s的所有条件状态位复位,将流的状态设置为有效。返回void
            s.clear(flags)                   根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate。返回void
            s.setstate(flags)                根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void
            s.rdstate()                      返回流s的当前条件状态,返回值类型为strm::iostate
        eg://记住当前cin的当前状态
            auto old_state = cin.rdstate();
            cin.clear();         //复位流的所有条件状态位,使流有效
            process_input(cin);    //使用cin
            cin.setstate(old_state);  //将cin置为原有状态
        //复位failbit和badbit,保持其他标志位不变
        cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
    
    管理输出缓冲
        每个输出流都管理一个缓冲区,用来保存程序读写的数据。
        导致缓冲刷新(即数据真正写到输出设备或文件)的原因:
            1 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
            2 缓冲区满时,需要刷新缓冲区,而后新的数据才能继续写入缓冲区
            3 可以使用操作符如endl来显示刷新缓冲区
            4 在每个输出操作之后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的
            5 一个输出流可能被关联到另一个流。在这种情况下当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,cin和cerr都关联到cout。因此,读cin
                或写cerr都会导致cout的缓冲区刷新
        刷新输出缓冲区:
            endl,ends,flush都可以刷新缓冲区
                endl: 完成换行并刷新缓冲区
                ends: 向缓冲区插入一个空字符,然后刷新缓冲区
                flush: 刷新缓冲区
        unitbuf操纵符
            如果想在每次输出操作之后都刷新缓冲区,可以使用unitbuf操纵符。它告诉流在接下来的每次写操作之后都进行一次flush操作;
        nounitbuf操纵符
            重置流,使其恢复使用正常的系统管理的缓冲区刷新机制
        eg: 
            cout << unitbuf;    //所有输出操作后都会立即刷新缓冲区
            //任何输出都立即刷新,无缓冲
            cout << nounitbuf;  //恢复正常的缓冲机制
        重要:如果程序崩溃,输出缓冲区不会被刷新
    
    关联输入和输出流
        当结果输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流。标准库将cout和cin关联在一起,因此 cin>>ival;导致cout缓冲区被刷新 (意思就是在你写之前先把缓冲区的内容打印出来)
    
    流关联设置
        tie有两个重载版本:
            x.tie();  //返回指向输出流指针 ,如果本对象当前关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联到流,则返回空指针
            x.tie(ostream *); //将自己关联到此ostream.即 x.tie(&o) 将流x关联到输出流
        既可以将一个istream对象关联到另一个ostream,也可以将一个ostream关联到另一个ostream;
        
        eg: cin.tie(&cout);    //将cin和cout关联在一起
            ostream *old_tie = cin.tie(nullptr);   //cin不再与其他流关联
            cin.tie(&cerr);  //读取cin会刷新cerr而不是cout
            cin.tie(old_tie);  //重建cin和cout件的正常关联
        注:每个流同时最多可以关联一个流,但多个流可以同时关联到一个流
文件输入输出
    头文件fstream定义了三个类型来支持文件IO:
        1 ifstream 从一个给定文件读取数据
        2 ofstream 向一个给定文件写入数据
        3 fstream 可以读写给定文件
    fstream、ifstream、和ofstream操作,不能对其他IO类型调用这些操作
                        fstream特有操作
        fstream fstm                          创建一个未绑定的文件流。fstream是头文件fstream中定义的一个类型
        fstream fstrm(s);                     创建一个fstream,并打开名为s的文件。s可以是string类型,或者是一个指向c风格字符串的指针。这些构造函数都是explicit的。默认的文件模式mode依赖于fstream的类型
        fstream fstrm(s,mode);                与前一个构造函数类似,但按指定mode打开文件
        fstrm.open(s);                        打开名为s的文件,并将文件与fstrm绑定。s可以是一个string或一个指向c风格字符串的指针。默认的文件mode依赖于fstream的类型,返回void
        fstrm.close();                        关闭于fstrm绑定的文件。返回void
        fstrm.is_open();                      返回一个Bool值,指出于fstrm关联的文件是否成功打开且尚为关闭
使用文件流对象
        在新c++标准中,文件名既可以是库类型string对象,也可以是c风格字符数组。
#C/C++#
全部评论
c++primer 的学习
点赞 回复 分享
发布于 2022-10-16 16:30 河南

相关推荐

点赞 评论 收藏
分享
想踩缝纫机的小师弟练...:不理解你们这些人,要放记录就把对方公司名字放出来啊。不然怎么网暴他们
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务