istream
和 ostream
类。我们已经使用过这些类的对象:cin
是 istream
类的对象,cout
是 ostream
类的对象。因此,我们实际上已经在使用与文件流相关的类了。事实上,我们可以像使用 cin
和 cout
一样使用文件流,唯一的区别是我们必须将这些流与物理文件关联起来。让我们来看一个例子:
|
|
[file example.txt] Writing this to a file. |
example.txt
的文件,并像我们习惯于使用 cout
那样,向其中插入一个句子,但这里使用的是文件流 myfile
。myfile
)来表示,对此流对象执行的任何输入或输出操作都将应用于与之关联的物理文件。open
:open (filename, mode);
filename
是一个表示要打开的文件名的字符串,mode
是一个可选参数,它是以下标志的组合:ios::in | 为输入操作(读取)而打开。 |
ios::out | 为输出操作(写入)而打开。 |
ios::binary | 以二进制模式打开。 |
ios::ate | 将初始位置设置在文件末尾。 如果不设置此标志,初始位置是文件的开头。 |
ios::app | 所有输出操作都在文件末尾进行,将内容追加到文件当前内容的后面。 |
ios::trunc | 如果文件是为输出操作而打开的,并且它已经存在,那么它之前的内容将被删除,并被新内容替换。 |
|
)进行组合。例如,如果我们想以二进制模式打开文件 example.bin
来添加数据,我们可以通过以下调用成员函数 open
来实现:
|
|
ofstream
、ifstream
和 fstream
类的每个 open
成员函数都有一个默认模式,如果在打开文件时没有提供第二个参数,就会使用这个默认模式:类 | 默认模式参数 |
---|---|
、ofstream | ios::out |
ifstream | ios::in |
fstream | ios::in | ios::out |
ifstream
和 ofstream
类,即使传递给 open
成员函数的第二个参数不包含 ios::in
或 ios::out
,它们也会被自动分别假定(这些标志会被组合)。fstream
,默认值仅在调用函数时未指定任何模式参数值的情况下应用。如果调用该函数时为该参数指定了任何值,则默认模式将被覆盖,而不是组合。open
成员函数,并且参数与该成员完全相同。因此,在我们之前的例子中,我们也可以通过以下方式声明 myfile
对象并执行相同的打开操作:
|
|
is_open
来实现。如果流对象确实与一个打开的文件相关联,该成员函数返回一个 bool
值为 true
,否则返回 false
。
|
|
close
。这个成员函数会刷新相关的缓冲区并关闭文件。
|
|
close
。ios::binary
标志的流。这些文件旨在存储文本,因此所有输入或输出它们的值都可能经历一些格式转换,这些转换不一定与其字面二进制值相对应。cout
的方式相同:
|
|
[file example.txt] This is a line. This is another line. |
cin
的相同方式进行:
|
|
This is a line. This is another line. |
true
;如果已到达文件末尾或发生其他错误,则为 false
。bool
值):bad()
true
。例如,当我们试图向一个未以写入模式打开的文件写入,或者我们试图写入的设备没有剩余空间时。fail()
bad()
相同的情况下返回 true
,但当发生格式错误时也返回 true
,例如当我们试图读取一个整数时却提取了一个字母字符。eof()
true
。good()
true
的情况下,它都返回 false
。注意,good
和 bad
并非完全相反(good
一次性检查更多的状态标志)。clear()
可以用来重置状态标志。ifstream
,像 istream
一样,保持一个内部的获取位置 (get position),即下一次输入操作要读取的元素的位置。ofstream
,像 ostream
一样,保持一个内部的放置位置 (put position),即下一个元素必须被写入的位置。fstream
,像 iostream
一样,同时保持获取位置和放置位置。streampos
的值,该类型表示当前的获取位置(对于 tellg
)或放置位置(对于 tellp
)。seekg ( position );
seekp ( position );
position
(从文件开头算起)。此参数的类型是 streampos
,与 tellg
和 tellp
函数返回的类型相同。seekg ( offset, direction );
seekp ( offset, direction );
direction
确定的特定点的偏移值。offset
的类型是 streamoff
。而 direction
的类型是 seekdir
,它是一个枚举类型,用于确定偏移量从哪个点开始计算,并且可以取以下任何值:ios::beg | 从流的开头计算偏移量 |
ios::cur | 从当前位置计算偏移量 |
ios::end | 从流的末尾计算偏移量 |
|
|
size is: 40 bytes. |
begin
和 end
使用的类型:
|
|
streampos
是用于缓冲区和文件定位的特定类型,也是 file.tellg()
返回的类型。这种类型的值可以安全地与同类型的其他值相减,也可以转换为足以容纳文件大小的整数类型。streampos
和 streamoff
。这些类型也被定义为流类的成员类型:类型 | 成员类型 | 描述 |
---|---|---|
streampos | ios::pos_type | 定义为 fpos<mbstate_t> 。它可以与 streamoff 相互转换,并且可以与这些类型的值进行加减运算。 |
streamoff | ios::off_type | 它是基本整数类型之一(如 int 或 long long )的别名。 |
<<
和 >>
)以及像 getline
这样的函数来读写数据是低效的,因为我们不需要格式化任何数据,而且数据很可能不是按行格式化的。write
和 read
。第一个(write
)是 ostream
的成员函数(由 ofstream
继承)。而 read
是 istream
的成员函数(由 ifstream
继承)。fstream
类的对象两者都有。它们的原型是:memory_block
的类型是 char*
(指向 char
的指针),表示一个字节数组的地址,读取的数据元素存储在这里,或者要写入的数据元素从这里获取。size
参数是一个整数值,指定要从内存块中读取或写入的字符数。
|
|
the entire file content is in memory |
ios::ate
标志打开,这意味着获取指针将被定位在文件的末尾。这样,当我们调用成员函数 tellg()
时,我们将直接获得文件的大小。
|
|
|
|
streambuf
的内部缓冲区对象相关联。这个缓冲区对象可以代表一个内存块,作为流和物理文件之间的中介。例如,对于一个 ofstream
,每次调用成员函数 put
(写入单个字符)时,该字符可能会被插入到这个中间缓冲区,而不是直接写入到与流关联的物理文件中。![]() 预处理器指令 | ![]() 目录 |