• C++语言不直接处理输入输出,而是通过一族定义在标准库中的类型来处理IO

    • iostream定义了用于读写流的基本类型
    • fstream定义了读写命名文件的类型
    • sstream定义了读写内存string对象的类型
  • 标准库使得我们能够忽略这些不同类型的流之间的差异,是通过继承机制实现的

  • 不能拷贝或者对IO对象赋值,因此也不能将形式参数或者返回类型设置为流类型,进行IO操作的函数通常是已引用方式传递和返回流,读写一个IO对象会改变其状态,因此传递和返回的引用不能是const

    strm::iostate  提供表达条件状态的完整功能
    strm::badbit    用来指出流已经崩溃
    strm::failbit   用来指出一个IO操作失败了
    strm::eofbit    用来指出流到达了文件结束
    strm::goodbit   用来指出流未处于错误状态,此值保证为零
    s.eof()         若流s的eofbit置位,返回true
    s.fail()
    s.bad()
    s.good()        若流s处于有效状态,返回true
    s.clear()       所有条件状态复位,将流的状态设置为有效,返回void
    s.clear(flags)  根据给定的flags标志位将流s中对应条件状态位复位
    s.setstate(flags)同上
    s.rdstate()     返回流s的当前条件状态
    
    auto old_state = cin.rdstate();       //记住cin的当前状态
    cin.clear()                         //使cin有效
    process_input(cin);                 //使用cin
    cin.setstate(old_state);            //将cin置为原有状态
    cin.clear(cin.rdstate & ~cin.failbit & ~cin.badbit);    //复位failbit和badbit,保持eofbit不变
    
  • 通过缓冲机制,操作系统可以将程序的多个输出操作组合成单一的系统级写操作。(原因在于设备的写操作可能很耗时)

  • 导致缓冲刷新的原因:

    • 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
    • 缓冲区满
    • 使用操纵符endl显式刷新缓冲区
    • 在每个输出操作后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区(默认情况下cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的)
    • 一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新
  • 除了endl外,还可以使用flushends刷新缓冲区,但是他们有不同的效果:

    cout << "hi" << endl;      //输出"hi\n"
    cout << "hi" << flush;        //输出"hi"
    cout << "hi" << ends;     //输出"hi "
    
  • 如果想在每次输出操作后都刷新缓冲区,我们可以使用unitbuf操纵符,它告诉流在接下来每次写操作后都进行一次flush操作

    cout << unitbuf;  //所有输出操作都会立即刷新缓冲区
    cout << nounitbuf;    //回到正常的缓冲方式
    
  • 调试/程序崩溃时要记得及时刷新缓冲区

  • 当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流(例如cincout)。交互式系统通常应该关联输入流和输出流。每个输入流最多关联到一个流,但多个流可以同时关联到同一个ostream

    cin.tie();              //返回cin关联的流,如果之前没有关联则返回空指针
    cin.tie(&cout);         //返回值同上,但是将cin与cout关联
    ostream *old_tie = cin.tie(nullptr);   //取消关联,同时保存关联的流的指针
    cin.tie(old_tie);       //恢复关联
    
  • 文件输入输出的流定义在头文件fstream

    fstream fstrm;
    fstream fstrm(s);       打开名为s的文件,s可以是string类型或者是一个指向C风格字符串的指针,默认的文件模式mode依赖                           fstream的类型
    fstream fstrm(s, mode);
    fstrm.open(s);          打开名为s的文件,并将文件与fstrm绑定,返回void
    fstrm.close();          关闭与fstrm绑定的文件,返回void
    fstrm.is_open(s);       返回一个bool,指出与fstrm关联的文件是否打开成功且尚未关闭
    
  • 我们可以用fstream代替iostream&,即在需要接受一个iostream类型引用或者指针参数的函数可以用一个对应的fstreamsstream来调用

  • 在使用流之前检查是一个好的习惯

  • 当一个fstream对象被销毁时,close会自动被调用

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

    in          以读方式打开,只可以对ifstream或fstream
    out         以写方式打开,只可以对ofstream或fstream,默认情况下,即使我们没有指定trunc,以out模式打开的文件也会被截             断,为了保留以out模式打开的文件的内容,我们必须同时指定app,或者指定infstream默认关联in和out
    app         每次操作均定位到文件末尾,只要trunc没有被设定就可以设定,包含out
    ate         打开文件后立即定位到文件末尾
    trunc       截断文件,只有当out也被设定时才能设定
    binary      以二进制方式进行IO
    
    //下面三种方式打开文件是等价的,都会截断文件
    ofstream out("file");
    ofstream out("file", ofstream::out);
    ofstream out("file", ofstream::out | ofstream::trunc);
    //为了保留文件的内容,我们必须显式指定app模式
    ofstream out("file", ofstream::app);
    ofstream out("file", ofstream::out | ofstream::app);
    
  • sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据

  • istringstreamstring读取数据,ostringstreamstring写入数据,stringstream既可以读也可以写

    sstream strm;
    sstream strm(s);        strm保存string类型的s的拷贝
    strm.str()              返回strm保存的string的拷贝
    strm.str(s)             将string s拷贝到strm中,返回void
    

C++Primer学习笔记:第8章 IO库相关推荐

  1. C++ Primer 学习笔记 第十七章 标准库特殊设施

    标准库特殊设施 637 初始化tuple #include <iostream> #include <vector> #include <string> #incl ...

  2. C++ Primer 学习笔记 第一,二章

    2021年4月4日,我终于开始学习C++啦,下面的笔记会记录着我的心酸的学习历程,每个标题会记录着下面代码在<C++中文版 Primer>中的页码 P6 实现两数之和 # include ...

  3. 预览文章: c++ primer学习笔记,二:标准库类型

    111111111111 转载于:https://www.cnblogs.com/kuangcheng/archive/2012/02/25/2368187.html

  4. C++ Primer 学习笔记(第四章:表达式)

    2019独角兽企业重金招聘Python工程师标准>>> ##C++ Primer 学习笔记(第四章:表达式) [TOC] ###4.1 基础 左值和右值: 当一个对象被用作右值的时候 ...

  5. 《C Primer Plus》学习笔记—第9章

    目录 <C Primer Plus>学习笔记 第9章 函数 1.复习函数 1.引入 2.创建并使用简单的函数:程序lethead1.c 3.分析程序 4.函数参数 1.程序lethead2 ...

  6. 《C Primer Plus》学习笔记—第12章

    目录 <C Primer Plus>学习笔记 第12章 存储类别.链接和内存管理 1.存储类别 1.作用域 2.链接 3.存储期 4.自动变量 1.程序hiding.c 2.没有花括号的块 ...

  7. 《C Primer Plus》学习笔记—第14章

    目录 <C Primer Plus>学习笔记 第14章 结构和其他数据形式 1.示例问题:创建图书目录 1.程序book.c 2.建立结构声明 3.定义结构变量 1.初始化结构 2.访问结 ...

  8. c++primer学习笔记

    c++ primer 5e学习笔记 第1章 1.标准库 类型和函数的集合,每个c++编译器都必须支持. 2.()运算符:调用运算符.跟随在函数名后,起调用函数的作用 第2章 1.p32:char在一些 ...

  9. 《Go语言圣经》学习笔记 第十一章 测试

    <Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...

  10. 《Go语言圣经》学习笔记 第六章 方法

    <Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...

最新文章

  1. 算法---删除排序链表中的重复元素 II
  2. JavaScript判断变量数据类型
  3. angr学习笔记(11)(SimProcedure)
  4. Educational Codeforces Round 93 (Rated for Div. 2)
  5. oracle12 扩充表空间,oracle查询及扩充表空间
  6. 外设驱动库开发笔记11:SHT3x系列温湿度传感器驱动
  7. mysql查询数据不变_mysql之delete删除记录后数据库大小不变
  8. 关于Web面试的基础知识点--Javascript(二)
  9. 服务器安装什么文件可以获取密码,服务器ssh密码在哪获取
  10. php(2)—基础补充
  11. android.os.log,android.os.Handler和java.util.logging.Handler之间的区别?
  12. 【WCF】错误处理(二):错误码―—FaultCode
  13. python中函数的返回值
  14. Vue slot用法(2018.09.05 星期三)
  15. 史上最全的 iOS 各种测试工具集锦,看看有没有你不知道的
  16. 系统思考负反馈之戴明的PDCA循环
  17. 一键把Android手机投屏到电脑上,非常简单
  18. [从头学数学] 第193节 推理与证明
  19. Linux中修改HTTP默认主页
  20. 三星android 8.0 流畅,三星Galaxy S8使用安卓Android 8.0:更顺滑更流畅

热门文章

  1. MS SQL 分页存储过程
  2. 使用Gitolite搭建Gitserver
  3. Python练习-迭代器-模拟cat|grep文件
  4. [转]粵語固有辭彙與漢語北方話辭彙對照
  5. 在需要时开启Perl新特性
  6. 本地执行php查看内存占用,查看页面执行php占用内存情况
  7. vue vue的table表格自适应_vue table autoHeight(vue 表格自动高度)
  8. java 18.9_Oracle: Java 11 (18.9 LTS) 正式上线!
  9. php年龄查询表单设计,PHP 处理表单
  10. 字节流转化为文件流_C#文件转换为字节流及字节流转换为文件