一、前言
IO类
IO对象无拷贝或赋值
由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为流类型。进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。
条件状态
|
|
文件输入输出
头文件fstream定义了三个类型来支持文件IO:ifstream从给定文件读取数据,ofstream向一个给定文件写入数据,以及fstream可以读写文件。
这些类型提供的操作与我们之前已经使用过的对象cin和cout的操作一样,特别是,我们可以用IO运算符(<<和>>)来读写文件,可以用getline从一个ifstream读取数据。
代码示例:
文件模式
每个流都有一个关联的文件模式(mode),用来指出如何使用文件。具体的mode有哪些呢?
不管用哪种方式打开文件,我们都可以指定文件模式,调用open显式打开或者用一个文件名初始化文件流来隐式打开文件都可指定文件模式。
但是上述模式间有限制关系:
- 只可以对ifstream和ifstream对象设定in模式
- 只可以对ofstream和fstream对象设定out模式
- 只有当out被设定时才能设定trunc模式
- 只要trunc没被设定,就可以设定app模式。在app模式下,即使没有显式指定out模式,文件也总是以输出方式打开
- 默认情况下,即使我们没有指定trunc模式,以out模式打开的文件也会被截断。为了保留以out模式打开的文件内容,我们必须同时指定app模式,这样只会将数据追加写到文件末尾;或者同时指定in模式,即打开文件同时进行读写操作。
每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式时,就使用此默认模式。与ifstream关联的文件默认以in模式打开,与ofstream关联的文件默认以out模式打开,与fstream关联的文件默认以in和out模式打开。
此外,有两点需要特别注意:
1:以out模式打开文件会丢弃已有数据
默认情况下,当我们打开一个ofstream时,文件的内容会被丢弃。阻止清空文件的方法是同时指定app模式。
|
|
小结:保留被ofstream打开的文件中内容的唯一方法是显示指定app或in模式。
2 :每次调用open时都会确定文件模式
对于一个给个流,每当打开文件时,都可以改变其文件模式。
|
|
名为file的文件内容将被清空,名为preFile的文件中已有的数据将都被保存。
小结:每次打开文件时,都要设置文件模式,可以是显式的设置,也可以是隐式的设置。当文件未指定模式时,都是使用默认值。
String流
sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。
istringstream从string读取数据,ostreamstream向string写入数据,而头文件stringstream既可以读数据也可向string写数据。
头文件sstream中定义的类型都继承自我们已经使用过的iostream头文件中定义的类型。除了继承得来的操作,sstream中定义的类型还增加了一些成员来管理与流相关联的string。
|
|
使用istringstream
当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的某个单词时,通常可以使用istringstream。
考虑如下文件,列出了一些人和他们的电话号码(电话号码多选)
我们定义一个简单的类来描述输入数据:
|
|
我们从文本中读入输入数据,并将输入数据写入到vector
以下是完整代码:
|
|
使用ostringstream
当我们逐步构造输出,希望最后一起打印是,ostringstream是很有用的。
|
|
输出badNums.str()!