type
status
date
slug
summary
tags
category
icon
password
Property
头文件
fstream
定义了三个类型来支持文件IO:ifstream
从给定文件读取数据,ofstream
向指定文件写入数据,fstream
可以同时读写指定文件。这些类型提供的操作与对象
cin
和cout
的操作一样。可以用IO
运算符(<<
和>>
)来读写文件,可以用getline
从一个ifstream
读取数据。除了继承自
iostream
类型的行为之外,fstream
中定义的类型还增加了一些新的成员来管理与流关联的文件。下表列出了这些操作,可以对fstream
,ifstream
和 ofstream
对象调用这些操作,但不能对其他IO
类型调用这些操作:使用文件流对象
当想要读写文件时,通常要定义一个文件流对象,并且将之关联到一个文件上。每个文件流对象都定义了
open
成员函数,它会做与系统相关的操作来定位给定的文件,并且视情况打开它进行读或写操作。使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系。文件常见的打开方式如下:
当创建文件流对象时可以选择性的提供一个文件名,如果提供了文件名,那么
open
就会自动调用:在
C++11
中,文件流对象的文件名可以是 string
对象或C风格字符数组。旧版本的标准库只支持C风格字符数组。使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写,其中对文件进行提取和插入操作的常用成员函数如下:
拷贝一份
test.cpp
文件生成copy.cpp
以二进制的形式操作文件:
以文本的形式操作文件
用fstream 代替iostream&
在要求使用基类对象的地方,可以用继承类型的对象代替。因此一个接受
iostream
类型引用或指针参数的函数,可以用对应的 fstream
类型(或sstream
类型)来调用。也就是说,如果有一个函数接受一个ostream&
参数,在调用这个函数时,可以传递给它一个 ofstream
对象,对istream&
和ifstream
也是类似的。open 和 close 成员函数
当定义一个空的文件流对象时,可以接着在后面通过
open
将其关联到一个文件上:如果调用
open
失败,会设置 failbit
,由于 open
可能会失败,所以最好需要验证一下 open
是否成功:如果打开失败,条件将会失败,就不能使用 out 对象。
一旦一个文件流对象被打开,它将与给定的文件持续关联。如果在一个已经打开的文件流对象上调用 open 将会失败,并且设置 failbit。接下来尝试使用这个文件流将会失败。为了将文件流对象关联到一个不同的文件上,需要选将之前的文件关闭,才能打开新的文件:
如果
open
成功的话,open
会将流的状态设置为 0 ,这样 good()
将返回 true
。当
fstream
对象被销毁时,close
会自动被调用。自动构建和析构
每次迭代时都会自动创建一个新的名为
input
的ifstream
对象并打开给定文件。由于input
是while
中的本地对象,它将在每次迭代时自动的创建和销毁。当fstream
对象离开作用域之后,与其关联的文件会自动关闭。在下一次迭代时会创建一个新的。文件模式
每个流都有一个关联的文件模式,用来指出如何使用文件:
指定文件模式有如下限制:
- 只能对
ofstream
或fstream
对象设定out
模式
- 只能对
ifstream
或fstream
对象设定in
模式
- 只有当
out
被设定时才能设定trunc
模式
- 只要
trunc
没被设定,就能设定app
模式。在app
模式下,即使没有设定out
模式,文件也是以输出方式打开
- 默认情况下,即使没有设定
trunc
,以out
模式打开的文件也会被截断。如果想保留以out
模式打开的文件内容,就必须同时设定app
模式,这会将数据追加写到文件末尾;或者同时设定in
模式,即同时进行读写操作
ate
和binary
模式可用于任何类型的文件流对象,并可以和其他任何模式组合使用
- 与
ifstream
对象关联的文件默认以in
模式打开,与ofstream
对象关联的文件默认以out
模式打开,与fstream
对象关联的文件默认以in
和out
模式打开
每个文件流类型都定义了一个默认的文件模式,当未指定文件模式时,就使用此默认模式。与
ifstream
关联的文件默认以 in
模式打开;与 ofstream
关联的文件默认以 out
模式打开;与 fstream
关联的文件默认以 in
和 out
模式打开。默认情况下,打开
ofstream
对象时,文件内容会被丢弃,阻止一个 ofstream
清空给定文件内容的方法是同时指定 app
模式:保留被
ofstream
打开的文件中已有数据的唯一方法是显式指定app
或in
模式流对象每次打开文件时都可以改变其文件模式:
保留被
ofstream
打开的文件中已有数据的唯一方法是显式指定 app
或 in
模式。