第八章-IO库

大部分IO库设施:

  • istream 输入流类型,提供输入操作
  • ostream 输出流类型,提供输出操作
  • cin ,一个istream对象,从标准输入读取数据
  • cout,一个ostream对象,向标准输出写入数据
  • cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误
  • >> 运算符,用来从一个istream对象读取输入数据
  • << 运算符,用来从一个ostream对象写入输出数据
  • getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中

8.1 IO类

在这里插入图片描述
其中w开头的表示支持宽字符的版本。

IO类型间的关系

ifstream、istringstream继承自istream,ofstream、ostringstream继承自ostream,派生类的对象可以当做基类来使用。所以可以像使用istream(cin)(ostream(cout))的对象一样使用两个派生类。

8.1.1 IO对象无拷贝或赋值

ofstream f1, f2;
f1 = f2; //错误

不能拷贝或赋值IO对象,所以给函数参数或者返回类型设定流类型时只能用引用的方式,并且不能是const的,因为IO对象进行读写后会发生变化。

8.1.2 条件状态

用流进行输入输出操作时,流可能处于错误状态,因此在使用之前检查它是否处于良好状态 。最简单的办法就是把它当做一个条件来使用。

while(cin >> word){...}

while循环检查>>表达式返回的流的状态,如果输入操作成功,流保持有效状态,则条件为真。

8.1.3 管理输出缓冲

每一个输出流都管理一个缓冲区,用来保存程序读写的数据。

cout << "ssssssss" ;

以上文本串,可能立即打印出来,也有可能被操作系统保留在缓冲区中,随后在打印。
为了能让数据立马输出,可以刷新缓冲区,导致缓冲区刷新的原因如下:
在这里插入图片描述在这里插入图片描述

  • 操作符endl完成换行并刷新缓冲区,IO库中还有flush和ends,flush刷新缓冲区,但不输出任何额外的字符。ends向缓冲区插入一个空字符,然后刷新缓冲区。
  • 使用unitbuf操作符使得每次输出操作后都刷新缓冲区,也就是在接下来每进行一次写操作后都进行一次flush操作,而nounitbuf操作符则是恢复正常的系统管理的缓冲区刷新机制。
cout << unitbuf;
cout <<nounitbuf;

8.2 文件输入输出

在这里插入图片描述

8.2.1 使用文件流对象

创建文件流对象时,可以提供文件名(可选的),如果提供了文件名,则open会被自动调用。

ifstream in(ifile); //创建一个ifstream并打开给定文件,ifile类型可以是string,也可以是c风格字符数组
ofstream out; //输出文件流,未关联到任何文件

如果定义了一个空文件流对象,随后可以调用open来将他与文件关联起来。

ofstream out;
out.open(ofile);//打开指定文件
if(out) ... //open可能会失败,进行open是否成功的检测是一个好习惯,open成功为真否则为假
//为了将文件流关联到另一个文件,要首先关闭已关联的文件,再打开新文件。
out.close(); //关闭文件
out.open(file); //打开另一个文件

当一个fstream对象被销毁时(离开作用域),close会自动调用。

8.2.2 文件模式

每个流都有一个关联的文件模式,用来指出如何使用文件。
在这里插入图片描述
指定文件模式时有如下限制:
在这里插入图片描述
在这里插入图片描述

默认情况下,打开一个ofstream时,文件类容会被丢弃,阻止他清空文件内容的方式是同时指定app模式:

ofstream out("file"); //隐含以out模式打开文件并截断
ofstream out("file", ofstream::out); //隐含截断截断文件
ofstream out("file", ofstream::out | ofstream::trunc); //隐含以out模式打开文件并截断
//为了保留文件内容,显示指定app模式
ofstream out("file", ofstream::app);
ofstream out("file", ofstream::out | ofstream::app);  

对于一个给定的流,当关闭一个文件,又重新打开一个文件时可以重新指定文件模式。

8.3 string流

string就像一个IO流一样,istringstream(读)、ostringstream(写)和stringstream(读写)可以对其进行读写操作。

在这里插入图片描述

8.3.1 使用istringtream

struct PersonInfo {
	string name;
	vector<string> phones;
}
string line, word;
vector<PersonInfo> people;
while(getline(cin, line)) {
	PersonInfo info;
	istringstream record(line);
	record >> info.name;
	while(record >> word) {
		info.phones.push_back(word);
	}
	people.push_back(info);
}

8.3.2 使用ostringstream

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值