引言:
为了支持不同种类的I/O处理操作,标准库定义了一些别的I/O类型: <iostream> <fstream> <sstream>
ofstream out1, out2;
out1=out2; //错误:不能对流对象进行赋值
ofstream print(ofstream); //错误:不能初始化ofstream参数
out2=print(out2); //错误:不能拷贝流对象
- 因为不能拷贝流对象,所以一般需要传递流对象时,常采用引用方式返回和传递流,并且流类型不能是const的。
流的条件状态:
strm::iostate | |
strm::badbit | 用来指出流已经崩溃 |
strm::failbit | 用来指出一个I\O操作失败 |
strm::eofbit | 用来指出流到达了文件结束 |
strm::goodbit | 指出流未处于错误状态 |
s.eof() | 若流的eofbit置位,返回true |
s.fail() | 若流的failbit置位,返回true |
s.bad() | 若流的badbit置位,返回true |
s.good() | 若流状态有效,返回true |
s.clear() | 将流中所有条件状态位复位,状态设置为有效 |
s.clear(flags) | 根据给定的flags,将流中所有条件状态位复位 |
s.setstate(flags) | 根据给定的flags,将流中所有条件状态位置位 |
s.rdstate() | 返回流的当前状态 |
一、基本I/O类型
头文件 <iostream>提供三个类型支持基本I/O: istream ostream iostream
没啥说的。。。
二、文件I/O
头文件 <fstream> 提供三个类型来支持文件I/O:ifstream ofstream fstream
fstream特有的操作:
fstream file; | 创建一个未绑定的文件流 |
fstream file(s); | 创建一个文件流,打开名为s的文件 |
fstream file(s, mode); | 创建一个文件流,以mode模式打开名为s的文件 |
file.open(s); | 指定文件流打开名为s的文件 |
file.close(); | 指定文件流关闭文件 |
file.is_open(); | 返回bool值,指出是否已打开一个文件 |
mode的类型有以下几种:
in | 读方式打开 |
out | 写方式打开 |
app | 每次写操作前定位到文件末尾 |
ate | 打开文件后定位到文件末尾 |
trunc | 截断文件 |
binary | 以二进制方式进行I/O |
- 只可以对ofstream或fstream指定out模式。
- 只可以对ifstream或fstream指定in模式。
- 只有当out被设定时才可设定trunc模式。
- 只要trunc未被设定,就可以设定app模式。且app模式总是以out模式打开。
- ate和binary适合任何类型的文件流对象。
三、string流
头文件 <sstream> 提供三个类型来支持文件I/O:istringstream ostringstream stringstream
sstream strm; |
strm是一个未绑定的stringstream对象 |
sstream strm(s); | strm是一个stringstream对象,保存string s的一个拷贝 |
strm.str() | 返回strm保存的string拷贝 |
strm.str(s) | 将string s拷贝到strm中 |
为了更好理解如何使用这些I/O库,一个问题:
假定有一个文件,列出了一些人名和他们的电话号码。人名只会出现一次,但一个人可能会有多个电话号码。因此输入文件大概是这样的:
xiaoming 1354345336 4568963254
bill 1323232323
tyrrty 4512554512 1597565232 1123556853
//需要类似这样的结构体保存人员信息
struct PersonInfo {
string name;
vector<string> phones;
}
//处理数据并将结果保存在一个vector中
vector<PersonInfo> people;
ifstream in("data.txt");
string line, num;
while (getline(in, line))
{
PersonInfo info;
istringstream record(line);
record>>info.name;
while (record>>num)
info.phones.push_back(num);
people.push_back(info);
}
in.close();