10.3 文件流 , k9 G V5 R2 j8 ~
文件流以磁盘文件以及其他可按文件方式进行管理的外部设备为输入输出对象。ifstream是文件输入流类,ofstream是文件输出流类,fstream是文件输入输出流类。要利用这些类来定义文件流对象,必须在程序的开始部分包含如下的预处理命令和名字空间声明:
5 k9 H* y- L# R$ a1 A #include ) A0 _& H o k
using namespace std;
* B* f6 c2 T) I; t4 u4 z! W" P% o P' T 1文件流的建立 ' \9 c T6 H# s
每个文件流都应当与一个打开的文件相联系。可以用两种不同的方式打开文件。 4 b& |% x# |2 z' h4 G( e
(1)在建立文件流对象的同时打开文件。
5 t+ s' |7 p, f2 s6 o (2)先建立文件流对象,再在适当的时候打开文件。 * w8 G1 ]: }: C7 { I
2文件流的关闭 ( \, U9 x& V8 Y, d. b% T' T
关闭文件流用成员函数close(),例如若fin是一个文件流对象,则可用下面的语句关闭: & _/ h3 w. x' p I9 y$ w
fin.close (); ( ?8 X" A( B1 N* X+ w% T
如果程序没有用close()主动关闭文件,则在文件流对象退出其作用域时,被自动调用的析构函数会关闭该对象所联系的文件。但我们提倡在打开的文件不再需要时及时并主动地将之关闭,以便尽早释放所占用的系统资源并尽早将文件置于更安全的状态。 9 M3 b% |# P8 y {) ?
3文件流状态的判别 ' p3 ~: I0 g, S+ I# ]
可以用文件流对象的下列成员函数来判别文件流的当前状态: 6 F# O! a4 T$ y# d5 B" [
is_open():判定流对象是否与一个打开的文件相联系,若是,返回true,否则返回false;
$ ?9 C! ]& @& v9 ? good():刚进行的操作成功时返回true,否则返回false;
6 Z, H% F0 d% m1 G2 N6 G fail():与good()相反,刚进行的操作失败时返回true,否则返回false;
1 `# I) d+ d8 B& L: L bad():如果进行了非法操作返回true,否则返回false; a- B. L8 Q' `% l7 p1 H8 Z
eof():进行输入操作时,若到达文件尾返回true,否则返回false. 0 y+ e0 D$ d) x7 _" G7 ]/ |2 X( K4 [
也可以直接针对流对象进行判断。假定input是一流对象,则 8 A; B" a. l, l5 A3 T8 b& ` z
if (! input)…等同于if(input.fail())…
* {3 P$ L; [* E5 r y if (input)…等同于if(input.good())…
! Y7 V0 p8 Q9 B# S/ B. y* E5 J0 g 4文件流的定位
0 O1 |$ p% h: o& r/ b# F (1)文件位置与定位方式 # B6 d2 q( L# a0 L- T
流的位置以字节为单位,通常表示为一个长整数,用类形符号pos_type代表。C+ +流的位置有两种:输入(get)位置和输出(put)位置。输入流只有输入位置,流对象中标志这种位置的指针称为输入指针。输出流只有输出位置,流对象中标志这种位置的指针称为输出指针。输入输出流两种位置都有,因而同时具备输入指针和输出指针:这两个指针可以分别控制、互不干扰。对于文件流,这两种指针可统称文件指针。
" d& ^2 F5 |6 V: g3 A+ Q1 n, U 每一次输入或输出都是从指针所指定的位置处开始的,指针在输入输出过程中不断移动,完成输入或输出 后即指向下一个需要输入或输出的位置。因此,在进行一般的输入输出操作时,指针总是向后(文件尾方向)移动。
' O, b/ ]" I! Y: g" N# q: n 也可以通过专门的定位操作操纵指针,而且既可以向后移动,也可以向前移动,见下面的说明。C+ +流的定位方式(也就是指针移动方式)有三种,被定义为ios_base::seek_dir中的一组枚举符号: 9 X1 s, L/ S: w& n5 a" R2 y
ios_base::beg 相对于文件首
0 _# w; S; v& }/ ? ios_base::cur 相对于当前位置(负数表示当前位置之前) ; z8 }( D" ?. ^, E
ios_base::end 相对与文件尾 |