《C++Primer》第八章——IO库

第八章:IO库

C++语言通过一族定义在标准库中的类型来处理IO,这些类型支持从设备读取数据、向设备写入数据的 IO 操作,设备可以是文件、控制台窗口等,还有一些类型允许内存 IO,即从 string 读取数据,向 string 写入数据

8.1 IO类

1.IO对象无拷贝或赋值

ofstream out1, out2;
out1 = out2;		//错误,不能对流对象赋值
ofstream print(ofstream);	//错误,不能初始化ofstream参数
out2 = print(out2)		//错误,不能拷贝流对象
  • 因为不能拷贝IO对象,因此不能将形参或返回类型设置为流类型
  • 进行IO操作的函数通常是以引用方式传递和返回流
  • 读写一个IO对象会改变其状态,因此传递和返回的引用不能是 const
    2.条件状态(P 279)
    3.管理输出缓冲
    1)每个输出流都管理一个缓冲区,用来保存程序读写的数据,这样做的原因是进行一次设备的写操作可能很耗时间,所以先写入到内存中的缓冲区,允许操作系统将多个输出组合为一次设备的写操作,可以提高性能
    2)何时刷新缓冲区(使数据真正写到设备或文件中),导致缓冲区刷新的原因有很多:
  • 程序正常结束,作为 main 函数的 return 操作的一部分,缓冲刷新被执行
  • 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区
  • 使用操纵符如 endl 来显示刷新缓冲区
  • 在每个输出操作之后,可以用操纵符 unitbuf 设置流的内部状态,来清空缓冲区;默认情况下,对 cerr 是设置 unitbuf 的,因此写到 cerr 的内容都是立即刷新的
  • 一个输出流可能被关联到另一个流,在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。比如默认情况下,cin 和 cerr 都关联到 cout,因此读 cin 或写 cerr 都会导致 cout 的缓冲区被刷新
    3)刷新输出缓冲区:endl、flush、ends
cout << "hi!" << endl;		//输出hi和一个换行,然后刷新缓冲区
cout << "hi!" << flush;		//输出hi,然后刷新缓冲区,不附加任何额外字符
cout << "hi!" << ends;		//输出hi和一个空字符,然后刷新缓冲区

注:若程序异常终止,输出缓冲区不会被刷新,当一个程序崩溃后,它所输出的数据很可能停留在输出缓冲区中等待打印
4)关联输入和输出流:当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流,交互式系统通常应该关联输入流和输出流,这意味着包括用户提示信息都会在读操作之前被打印出来
注:每个流最多关联到一个流,但多个流可以同时关联到同一个 ostream

8.2 文件输入输出

1.使用文件流对象
1)创建文件流对象时,可以可选的提供文件名,若提供了文件名,则open会自动被调用

ifstream in(ifile);		//构造一个ifstream并打开给定文件
ofstream out;			//输出文件流未关联到任何文件

2)在要求使用基类型对象的地方,我们可以使用继承类型的对象来代替
因此,对于接受一个 iostream 类型引用(或指针)参数的函数,可以用一个对应的 fstream(或 sstream)类型类调用
注: 类型 ifstream 和 istringstream 都继承自 istream
类型 ofstream 和 ostringstream 都继承自 ostream
类型 fstream 和 stringstream 都继承自 iostream
3)成员函数 open 和 close

  • 若定义了一个空文件流对象,可以随后调用 open 来将它与文件关联起来
  • 若调用 open 失败,failbit 会被置位,因此进行 open 是否成功的检测通常是一个好习惯
if(out)	//检查open是否成功
		//与cin用作条件类似,若open失败,条件为假,我们就不会使用out了
  • 一旦一个文件流已经打开,它就保持与对应文件的关联,而对一个已经打开的文件流调用open会失败,并导致 failbit 被置位,随后的试图使用文件流的操作都会失败
  • 为了将文件流关联到另外一个文件,必须关闭已关联的文件,一旦文件成功关闭,则可以打开新的文件
in.close();				//关闭文件
in.open(ifile + "2");	//打开另一个文件

若 open 成功,则 open 会设置流的状态,使得 good() 为 true

  • 当一个 fstream 对象离开其作用域时,与之关联的文件会自动关闭;当一个 fstream 对象被销毁时,close 会被自动调用
    2.文件模式
    1)每个流都有一个关联的文件模式,用来指出如何使用文件,且每个文件流类型都定义了默认的文件模式,在未指定文件模式时,就使用此默认模式
  • 与 ifstream 关联的文件默认以 in 模式打开
  • 与 ofstream 关联的文件默认以 out 模式打开
  • 与 fstream 关联的文件默认以 in 和 out 模式打开
    2)以 out 模式打开文件会丢弃已有数据:默认情况下,当我们打开一个 ofstream 时,文件的内容会被丢弃,阻止一个 ofstream 清空给定文件的方法是同时指定 app 模式
ofstream out("file1");		//隐含以输出模式打开文件并截断文件,即该文件被清空了
//为保留文件内容,必须显式指定app模式
ofstream app("file2",ofstream::app);	//隐含为输出模式
ofstream app("file2",ofstream::out | ofstream::app);

注:保留被 ofstream 打开的文件中已有的数据的位移方法是显式地指定 app 或 in 模式
3)每次调用 open 时都会确定文件模式:在每次打开文件时,都要设置文件模式,可能是显式地设置,也可能是隐式地设置,当程序未指定模式时,就使用默认值

8.3 string流

1.使用 istringstream:当我们的工作时对整行文本进行处理,而其他一些工作时处理行内的单个单词时,通常可以使用 istringstream
2.使用 ostringstream:当我们逐步构造输出,希望最后一起打印时,ostringstream 是很有用的,即可以理解为 ostringstream 流里可以保存字符串的拷贝,在需要时输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值