C++Primer学习笔记:第8章 IO库
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
外,还可以使用flush
和ends
刷新缓冲区,但是他们有不同的效果:cout << "hi" << endl; //输出"hi\n" cout << "hi" << flush; //输出"hi" cout << "hi" << ends; //输出"hi "
如果想在每次输出操作后都刷新缓冲区,我们可以使用
unitbuf
操纵符,它告诉流在接下来每次写操作后都进行一次flush
操作cout << unitbuf; //所有输出操作都会立即刷新缓冲区 cout << nounitbuf; //回到正常的缓冲方式
调试/程序崩溃时要记得及时刷新缓冲区
当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流(例如
cin
和cout
)。交互式系统通常应该关联输入流和输出流。每个输入流最多关联到一个流,但多个流可以同时关联到同一个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
类型引用或者指针参数的函数可以用一个对应的fstream
或sstream
来调用在使用流之前检查是一个好的习惯
当一个
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
读取数据istringstream
从string
读取数据,ostringstream
向string
写入数据,stringstream
既可以读也可以写sstream strm; sstream strm(s); strm保存string类型的s的拷贝 strm.str() 返回strm保存的string的拷贝 strm.str(s) 将string s拷贝到strm中,返回void
C++Primer学习笔记:第8章 IO库相关推荐
- C++ Primer 学习笔记 第十七章 标准库特殊设施
标准库特殊设施 637 初始化tuple #include <iostream> #include <vector> #include <string> #incl ...
- C++ Primer 学习笔记 第一,二章
2021年4月4日,我终于开始学习C++啦,下面的笔记会记录着我的心酸的学习历程,每个标题会记录着下面代码在<C++中文版 Primer>中的页码 P6 实现两数之和 # include ...
- 预览文章: c++ primer学习笔记,二:标准库类型
111111111111 转载于:https://www.cnblogs.com/kuangcheng/archive/2012/02/25/2368187.html
- C++ Primer 学习笔记(第四章:表达式)
2019独角兽企业重金招聘Python工程师标准>>> ##C++ Primer 学习笔记(第四章:表达式) [TOC] ###4.1 基础 左值和右值: 当一个对象被用作右值的时候 ...
- 《C Primer Plus》学习笔记—第9章
目录 <C Primer Plus>学习笔记 第9章 函数 1.复习函数 1.引入 2.创建并使用简单的函数:程序lethead1.c 3.分析程序 4.函数参数 1.程序lethead2 ...
- 《C Primer Plus》学习笔记—第12章
目录 <C Primer Plus>学习笔记 第12章 存储类别.链接和内存管理 1.存储类别 1.作用域 2.链接 3.存储期 4.自动变量 1.程序hiding.c 2.没有花括号的块 ...
- 《C Primer Plus》学习笔记—第14章
目录 <C Primer Plus>学习笔记 第14章 结构和其他数据形式 1.示例问题:创建图书目录 1.程序book.c 2.建立结构声明 3.定义结构变量 1.初始化结构 2.访问结 ...
- c++primer学习笔记
c++ primer 5e学习笔记 第1章 1.标准库 类型和函数的集合,每个c++编译器都必须支持. 2.()运算符:调用运算符.跟随在函数名后,起调用函数的作用 第2章 1.p32:char在一些 ...
- 《Go语言圣经》学习笔记 第十一章 测试
<Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...
- 《Go语言圣经》学习笔记 第六章 方法
<Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...
最新文章
- 算法---删除排序链表中的重复元素 II
- JavaScript判断变量数据类型
- angr学习笔记(11)(SimProcedure)
- Educational Codeforces Round 93 (Rated for Div. 2)
- oracle12 扩充表空间,oracle查询及扩充表空间
- 外设驱动库开发笔记11:SHT3x系列温湿度传感器驱动
- mysql查询数据不变_mysql之delete删除记录后数据库大小不变
- 关于Web面试的基础知识点--Javascript(二)
- 服务器安装什么文件可以获取密码,服务器ssh密码在哪获取
- php(2)—基础补充
- android.os.log,android.os.Handler和java.util.logging.Handler之间的区别?
- 【WCF】错误处理(二):错误码―—FaultCode
- python中函数的返回值
- Vue slot用法(2018.09.05 星期三)
- 史上最全的 iOS 各种测试工具集锦,看看有没有你不知道的
- 系统思考负反馈之戴明的PDCA循环
- 一键把Android手机投屏到电脑上,非常简单
- [从头学数学] 第193节 推理与证明
- Linux中修改HTTP默认主页
- 三星android 8.0 流畅,三星Galaxy S8使用安卓Android 8.0:更顺滑更流畅
热门文章
- MS SQL 分页存储过程
- 使用Gitolite搭建Gitserver
- Python练习-迭代器-模拟cat|grep文件
- [转]粵語固有辭彙與漢語北方話辭彙對照
- 在需要时开启Perl新特性
- 本地执行php查看内存占用,查看页面执行php占用内存情况
- vue vue的table表格自适应_vue table autoHeight(vue 表格自动高度)
- java 18.9_Oracle: Java 11 (18.9 LTS) 正式上线!
- php年龄查询表单设计,PHP 处理表单
- 字节流转化为文件流_C#文件转换为字节流及字节流转换为文件