- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
|
< align=left><FONT color=#cc0000><B>文件
: \! x/ ~5 @- B! c+ T. k [, |. s" e0 H, D# W8 Z/ D( A
</B></FONT><FONT color=#ff0000>文件的基本概念</FONT>
+ X6 ^7 N' D/ t$ w) w) K! G' E$ Z) X 所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。
: e& w5 _- ^$ l( i2 v' ^9 u" A8 [' j/ W' i% t6 V
普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序; 也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源文件、目标文件、 可执行程序可以称作程序文件,对输入输出数据可称作数据文件。
# h# g1 n$ @/ Y [- V- R& M9 x6 h4 k( r
* {9 @- [2 K0 N; r 设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。 通常把显示器定义为标准输出文件, 一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用的printf,putchar 函数就是这类输出。键盘通常被指定标准的输入文件, 从键盘上输入就意味着从标准输入文件上输入数据。scanf,getchar函数就属于这类输入。
8 z; p2 u1 Q* k: X) J, V( u g: v
/ X+ f- B: \# O6 o9 M 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。
( U# C; F- G2 y5 K6 W9 f5 Y; R$ ~' U) J$ l9 X
ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:3 j9 c; x W- R/ @# R" S. \1 f
ASC码: 00110101 00110110 00110111 00111000
# x+ b9 U( f ~; {- L& H ↓ ↓ ↓ ↓
: E1 R0 g/ X3 U) _9 |1 |- U. C6 _! c十进制码: 5 6 7 8 共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。; \+ ]! C2 l2 _3 ]- I4 J6 Z
0 i3 |: o: C: P: R1 q
二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的存储形式为: 00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示, 但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。 因此也把这种文件称作“流式文件”。
7 P0 a: ]7 l; f4 K; e! h% ~3 N- q2 m4 h9 P" s, e- q
本章讨论流式文件的打开、关闭、读、写、 定位等各种操作。文件指针在C语言中用一个指针变量指向一个文件, 这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。 定义说明文件指针的一般形式为: FILE* 指针变量标识符; 其中FILE应为大写,它实际上是由系统定义的一个结构, 该结构中含有文件名、文件状态和文件当前位置等信息。 在编写源程序时不必关心FILE结构的细节。例如:FILE *fp; 表示fp是指向FILE结构的指针变量,通过fp 即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件, 实施对文件的操作。习惯上也笼统地把fp称为指向一个文件的指针。文件的打开与关闭文件在进行读写操作之前要先打开,使用完毕要关闭。 所谓打开文件,实际上是建立文件的各种有关信息, 并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。2 K' V e7 o- A, j& P$ A1 M4 _
& P8 O2 ?7 W: _0 Z- r0 |% _5 S0 o 在C语言中,文件操作都是由库函数来完成的。 在本章内将介绍主要的文件操作函数。" Z/ t2 E% i8 H: S0 D# _0 \' R
% K" J* f ~( c<FONT color=#ff0000>文件打开函数fopen</FONT>
" `( D. U" h) w w, t. p# N
+ P- A2 u$ I {" D$ L' B0 \5 g fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。例如:
4 d/ k. J& a+ N, R<FONT color=#009900>FILE *fp;
) u9 V% a4 ]6 nfp=("file a","r");</FONT>
! G$ [" j* q$ }; |, s, ?1 @其意义是在当前目录下打开文件file a, 只允许进行“读”操作,并使fp指向该文件。
3 G5 I0 M k: |1 t# g, W- {) M% C/ V又如:5 ?4 c) B2 K6 m( a u" t
<FONT color=#009900>FILE *fphzk
' L1 A. i; C) r4 Y* y+ Jfphzk=("c:\\hzk16',"rb")</FONT>
. t: {2 X# h* V' z5 n其意义是打开C驱动器磁盘的根目录下的文件hzk16, 这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。使用文件的方式共有12种,下面给出了它们的符号和意义。 : f' Z1 n1 r, G4 [
文件使用方式 意 义* n4 R( `3 ~, d# Z5 \
<FONT color=#009900>“rt” 只读打开一个文本文件,只允许读数据
8 |, x) {/ m$ a( b* b“wt” 只写打开或建立一个文本文件,只允许写数据
/ h8 z+ m: l; D% M“at” 追加打开一个文本文件,并在文件末尾写数据5 \9 h; b( d1 u* M6 N1 W8 |5 a
“rb” 只读打开一个二进制文件,只允许读数据
* d, C' b, |: G4 _3 @/ M, ]“wb” 只写打开或建立一个二进制文件,只允许写数据
! G& d# V4 B% |6 S“ab” 追加打开一个二进制文件,并在文件末尾写数据8 u; g A* T z4 `5 {
“rt+” 读写打开一个文本文件,允许读和写$ {' g5 t7 v+ x; y5 E: B
“wt+” 读写打开或建立一个文本文件,允许读写
6 w& L: N0 L' b9 @' D4 |' d1 |“at+” 读写打开一个文本文件,允许读,或在文件末追加数 据
% L5 j; V) _2 J7 @& j0 U h“rb+” 读写打开一个二进制文件,允许读和写 / ?' @$ Y. v N% x1 S
“wb+” 读写打开或建立一个二进制文件,允许读和写6 e! W0 [. l2 b* \& f" a
“ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据
; x3 b8 R" u& h h+ _/ Z( ~</FONT>
8 a1 h" M9 M$ T& l V! l对于文件使用方式有以下几点说明:1 {2 w2 A6 r/ `5 Z
1. 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
! i. [4 f2 D/ {- `r(read): 读
8 S( S! w M2 z/ U7 i4 X& j jw(write): 写: Q( e% Z% y' f. r2 ~# N" e/ w
a(append): 追加$ M6 Y- O( v6 i( b
t(text): 文本文件,可省略不写. _, }. n, J( x6 `: C
b(banary): 二进制文件/ S8 b3 P6 C8 q/ X* Y0 s6 `( q: K
+: 读和写2 w* m# O$ H8 |
1 v: _/ z3 Y5 d9 q) n+ m2. 凡用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。
5 P4 @. U) S) L8 q. c& i; o! T8 s
3. 用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。
5 |& D, f- f& |' s
: r3 r4 n8 L& V5 }( }! V0 X6 h5 m4. 若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。. q6 W+ X1 B: O4 s
( P! m1 Y5 o6 e6 f7 l B& _
5. 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:
, T6 X8 o( A6 p& L: t- p# x* K<FONT color=#009900>if((fp=fopen("c:\\hzk16","rb")==NULL), [1 C3 z7 u5 D% Z. ?% `
{+ R) |3 q5 q6 I0 M9 m
printf("\nerror on open c:\\hzk16 file!");1 B$ U) M# H% I/ q, a/ o, G
getch();
9 G# ?$ U" u2 v* r2 s7 Eexit(1);. t) z0 s- D4 Q% ^7 K
}6 D3 u. H7 t: O& H% c
</FONT> 这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16file!”,下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待, 只有当用户从键盘敲任一键时,程序才继续执行, 因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。
* x/ L) h& X5 k
0 j f6 n. o7 ]0 Q' j. s6. 把一个文本文件读入内存时,要将ASCII码转换成二进制码, 而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。5 j( G0 X5 ]- z" A1 r6 K. ~% V5 g
6 b4 e. p9 W0 |: B
7. 标准输入文件(键盘),标准输出文件(显示器 ),标准出错输出(出错信息)是由系统打开的,可直接使用。文件关闭函数fclose文件一旦使用完毕,应用关闭文件函数把文件关闭, 以避免文件的数据丢失等错误。
8 F* A/ j' X/ ~$ v+ G: P! _( N' ?8 D7 r5 P; {! j
<FONT color=#ff0000>fclose函数
, b$ ~1 x" l" ~) H& F# e
t3 x }9 @- Y2 F</FONT>调用的一般形式是: fclose(文件指针); 例如:8 t2 \ s" {: I7 K1 g& s
fclose(fp); 正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。文件的读写对文件的读和写是最常用的文件操作。
# Y- p# F* w5 x8 C3 [9 f$ z9 x- I. y9 J3 \! b/ g3 h
在C语言中提供了多种文件读写的函数: / {2 l+ g$ R* e5 T0 D/ Z
·字符读写函数 :fgetc和fputc
+ U9 L6 _9 {/ E1 j3 g* Q( N% I* M·字符串读写函数:fgets和fputs
% d7 f" P1 @, X4 G1 `6 k4 k; \; U, Z·数据块读写函数:freed和fwrite
% I L9 u9 }# o+ T) @·格式化读写函数:fscanf和fprinf% `/ K2 B( E" M4 F3 _
& O- f" \; l( A5 E' Z. `! u4 X+ | g 下面分别予以介绍。使用以上函数都要求包含头文件stdio.h。字符读写函数fgetc和fputc字符读写函数是以字符(字节)为单位的读写函数。 每次可从文件读出或向文件写入一个字符。
% `2 c2 G- w3 J" j6 [- D9 O- a$ k$ A. F
<FONT color=#ff0000>一、读字符函数fgetc</FONT>
5 Y: V6 b3 y& Z O) p
/ N; a% e/ |5 n; n; k$ ]# } n fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为: 字符变量=fgetc(文件指针); 例如:ch=fgetc(fp);其意义是从打开的文件fp中读取一个字符并送入ch中。
$ z& X8 p' f: D, D2 ~2 a* n, @0 _/ |: |. H) p- o
对于fgetc函数的使用有以下几点说明:
( Q+ p% k6 }& D8 @4 ? g- t1. 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。; `, b* a# O) g6 Y4 @
. }" g9 a2 {& V: |* B9 `
2. 读取字符的结果也可以不向字符变量赋值,例如:fgetc(fp);但是读出的字符不能保存。& I% j. a0 L* p4 I0 o
1 `+ S* W7 B* P% z' p% l
3. 在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后, 该位置指针将向后移动一个字节。 因此可连续多次使用fgetc函数,读取多个字符。 应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。
, y8 s6 x' \+ m- N9 x
( T# }3 T: T# W0 w- q8 W<FONT color=#ff00ff><B>[例10.1]</B></FONT>读入文件e10-1.c,在屏幕上输出。
' b. J: P6 D- s6 A+ ^4 h<FONT color=#009900>#include<stdio.h>; S2 R9 _3 _ l" m3 h
main()8 l5 b6 d. @- |1 i7 s
{
8 D) r" @% d0 a( b; E2 ]0 `) BFILE *fp;
1 w/ s( w6 t. j0 N0 ichar ch;7 ` B Z3 V+ ?# J
if((fp=fopen("e10_1.c","rt"))==NULL)7 s, o, o/ A: q2 J9 ?7 {
{. H& m- ^& }; D6 \
printf("Cannot open file strike any key exit!");
( Y& u# z! A m/ Wgetch();
+ H* [0 ]& V1 vexit(1);6 v1 y% I$ k; j) T0 V0 S1 [
} \9 c2 f. ?: f" j0 t* {) W
ch=fgetc(fp);5 S G% O: \3 G, @0 I( R! s6 S
while (ch!=EOF)
0 _# ?* n, b0 F/ `5 r: s; B, n{; [' L8 e/ E$ x
putchar(ch);+ H; A# G" b9 W4 h$ w3 ?4 P
ch=fgetc(fp);
! v6 c: N8 N* ~4 [2 }2 d}
' r* h5 ^4 W/ p+ H* lfclose(fp);
# e5 i$ \; L, v5 M8 [4 ?/ _}</FONT>9 Y5 k* `4 u% |6 s* w6 Z- y
本例程序的功能是从文件中逐个读取字符,在屏幕上显示。 程序定义了文件指针fp,以读文本文件方式打开文件“e10_1.c”, 并使fp指向该文件。如打开文件出错, 给出提示并退出程序。程序第12行先读出一个字符,然后进入循环, 只要读出的字符不是文件结束标志(每个文件末有一结束标志EOF)就把该字符显示在屏幕上,再读入下一字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。执行本程序将显示整个文件。$ [* B& _$ I. W: v* ?5 I% v
) n& [ B' b3 l8 F5 M
<FONT color=#ff0000>二、写字符函数fputc</FONT>
M& L2 C/ B% @
* ?8 {* J% ?+ p8 ` fputc函数的功能是把一个字符写入指定的文件中,函数调用的 形式为: fputc(字符量,文件指针); 其中,待写入的字符量可以是字符常量或变量,例如:fputc('a',fp);其意义是把字符a写入fp所指向的文件中。5 ^7 p1 I9 Z0 _) K/ Q2 `2 V% J
! A# O: p/ B/ a. z! \
对于fputc函数的使用也要说明几点:
( Z M* A7 x6 m$ \+ w1. 被写入的文件可以用、写、读写,追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。* b" X5 N6 a9 t" N! |+ x
) d$ c; W! L2 p( S& U2. 每写入一个字符,文件内部位置指针向后移动一个字节。1 o: T5 V# O: G9 w. v( k* m
" |" R3 v' _% {0 \% a2 M0 P3. fputc函数有一个返回值,如写入成功则返回写入的字符, 否则返回一个EOF。可用此来判断写入是否成功。
c7 \2 i6 s) K5 d6 F% p; P6 Z$ a' v/ x
<FONT color=#ff00ff><B>[例10.2]</B></FONT>从键盘输入一行字符,写入一个文件, 再把该文件内容读出显示在屏幕上。
9 i" a( z6 Z/ _& B" U& d" u/ w<FONT color=#009900>#include<stdio.h>" R8 L2 ~) h5 t$ R; o6 `5 ?7 M4 m! o' M
main()! o& D; w. T! A+ S6 `1 s5 t5 F
{+ w8 V8 f% |: P) p. @5 p
FILE *fp;) U. n B+ C) D9 ]+ k& x. \. Q8 s' p
char ch;
# b( h, }! r! } a# `1 N$ Nif((fp=fopen("string","wt+"))==NULL)2 x f. e1 F1 W' L \, j9 o
{
& X2 U `9 _1 @6 L+ t8 xprintf("Cannot open file strike any key exit!");0 X& B: ~$ j: ~+ u3 r# x/ N9 e
getch();
, i. r$ a R. H3 Zexit(1);6 o% r6 O/ @1 z; E/ w
}* _; A8 \: }* q. P5 A
printf("input a string:\n");2 D e3 H: X) C0 H5 L
ch=getchar();0 n& p& i9 Q' C, @$ _5 ?' A
while (ch!='\n')
8 \5 C* |" ?: L* g9 |& J9 W4 ]6 N{
8 j& B' ]5 K: ^fputc(ch,fp);! ]" S& W1 X' L) e" M! N m' R
ch=getchar();
0 A3 Y/ k# ~$ p9 c5 P" \}( t2 z5 p1 o. Q% h- _
rewind(fp);- m: K! o2 J$ H; T1 M3 e
ch=fgetc(fp);
& T" n9 t" R) P- R$ U R) T: \while(ch!=EOF)
& P& @7 w/ l$ V0 Q{
, m1 y9 w: |* K% B4 A% Z% qputchar(ch);# Q) m; j) o+ \" g- b( {8 Y0 W
ch=fgetc(fp);' @3 s1 u6 f+ j7 ]
}
1 W) Z: j- c4 w- V8 e, ]* I# Lprintf("\n");
4 W4 Z" U) [1 ?6 T1 [9 vfclose(fp);+ B" o3 c$ H" n/ e: }
}</FONT>4 F$ q L1 | ^& P
程序中第6行以读写文本文件方式打开文件string。程序第13行从键盘读入一个字符后进入循环,当读入字符不为回车符时, 则把该字符写入文件之中,然后继续从键盘读入下一字符。 每输入一个字符,文件内部位置指针向后移动一个字节。写入完毕, 该指针已指向文件末。如要把文件从头读出,须把指针移向文件头, 程序第19行rewind函数用于把fp所指文件的内部位置指针移到文件头。 第20至25行用于读出文件中的一行内容。
0 K0 i+ c. p: F
9 q. O" k1 s+ W' D+ \<FONT color=#ff00ff><B>[例10.3]</B></FONT>把命令行参数中的前一个文件名标识的文件, 复制到后一个文件名标识的文件中, 如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。1 p9 F( W3 G0 t
<FONT color=#009900>#include<stdio.h>
- x3 H7 f- @( G4 T2 Y& M3 d |! ]% hmain(int argc,char *argv[])/ c2 c* A3 E, _8 W" U/ P1 p
{" Y" X j: M( n% b# Q, K6 q
FILE *fp1,*fp2;
( I' p! D; n: Z) \/ }char ch;. e, K. Y6 P) r+ H6 g- K: S" X/ j
if(argc==1)
8 v$ u, m6 h4 w! P% K9 A{
) W& r3 C* K& h0 S1 |, ^1 ?printf("have not enter file name strike any key exit");
7 a2 T4 K3 |$ q/ p* S9 o: vgetch();
, Z* J6 D" u$ ?4 w* Iexit(0);
9 O7 B& z1 q7 B' R}/ j( l5 S3 ?8 X9 x$ U
if((fp1=fopen(argv[1],"rt"))==NULL)$ o# j3 ~& K8 e; f2 w0 I2 z( d
{
0 T& }1 j) ^3 D# {3 rprintf("Cannot open %s\n",argv[1]);
/ c8 [! _( o7 q% W: X$ Ngetch();- Q. ?7 v2 k: y4 ]' z2 k0 E
exit(1);7 k7 S8 Z( O' }0 s6 S
}2 t! ^* W# c' A" ?% Q
if(argc==2) fp2=stdout;
- n8 Q1 }; o6 E' p% u( Nelse if((fp2=fopen(argv[2],"wt+"))==NULL)
, N4 K1 h p9 d5 R4 K X! w{
s, e0 J7 C: W8 N: d( _8 Hprintf("Cannot open %s\n",argv[1]);, T# R2 K& |- W. A ?: F1 n
getch();
" b" |& m0 ?& cexit(1);( O+ }0 @& U5 g. R: j1 L
}
+ l: C/ i6 e, [! |6 v: o9 t; m3 y/ ~while((ch=fgetc(fp1))!=EOF)4 S- u% T( O( S: I2 N/ a: C9 C
fputc(ch,fp2);( u9 g9 o x1 A5 T w* P0 Y
fclose(fp1);! x" y1 K: B0 b8 ~9 S
fclose(fp2);
! Y4 f) l9 b( j( x! K! P}</FONT>
1 E: F- d8 {3 ~: |4 z& Y) ^ 本程序为带参的main函数。程序中定义了两个文件指针 fp1 和fp2,分别指向命令行参数中给出的文件。如命令行参数中没有给出文件名,则给出提示信息。程序第18行表示如果只给出一个文件名,则使fp2指向标准输出文件(即显示器)。程序第25行至28行用循环语句逐个读出文件1中的字符再送到文件2中。再次运行时,给出了一个文件名(由例10.2所建立的文件), 故输出给标准输出文件stdout,即在显示器上显示文件内容。第三次运行,给出了二个文件名,因此把string中的内容读出,写入到OK之中。可用DOS命令type显示OK的内容:字符串读写函数fgets和fputs
2 d9 t' m# l2 j
- g5 @6 r' [+ u) @7 N一、<FONT color=#ff0000>读字符串函数fgets函数</FONT>的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针); 其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。
% z% E- _1 m3 o# i1 E- Q' y<B><FONT color=#ff00ff>[例10.4]</FONT></B>从e10_1.c文件中读入一个含10个字符的字符串。
7 o) v. L- K# F7 B: Y<FONT color=#009900>#include<stdio.h>1 n" n& [! y) j7 L+ w4 F9 u
main()
) N3 j) S- i1 e4 ?9 E{
$ J8 y& m0 z* ^5 }" x% i# jFILE *fp;$ N7 {2 r3 T G1 n
char str[11]; T7 J: d% ^7 Y ?( E5 O
if((fp=fopen("e10_1.c","rt"))==NULL)
5 w4 H4 i; x Y# J7 s{( @0 u- M2 ^6 D3 Z: I; i" [- p
printf("Cannot open file strike any key exit!");- A" ]1 X. ?0 u- t. {
getch();' I% } S+ `4 _. {' F
exit(1);6 M' C2 a6 w+ ?+ S
}
0 E/ ]3 }1 K6 H+ Wfgets(str,11,fp);
' Z/ k O4 e) O* }. `" _ r; dprintf("%s",str);" A6 `: O, o! z4 M, o9 `
fclose(fp);
* D' A0 _& [1 Q" ~- D4 e, d}</FONT>
; R K; W- q6 R/ F3 n 本例定义了一个字符数组str共11个字节,在以读文本文件方式打开文件e101.c后,从中读出10个字符送入str数组,在数组最后一个单元内将加上'\0',然后在屏幕上显示输出str数组。输出的十个字符正是例10.1程序的前十个字符。
8 D4 J- a! M+ f$ Z8 Z0 M( f6 ^, s: ~
对fgets函数有两点说明:
( v/ D% Q* t) s. q7 w1. 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。5 a# J8 Q: G( n' K
2. fgets函数也有返回值,其返回值是字符数组的首地址。
% J# |! o: s3 q. ]
5 V0 U# ^, a- X. G) B<FONT color=#ff0000>二、写字符串函数fputs</FONT>
% [, o" W* a8 |1 I9 D0 d) o+ Z$ P' S
fputs函数的功能是向指定的文件写入一个字符串,其调用形式为: fputs(字符串,文件指针) 其中字符串可以是字符串常量,也可以是字符数组名, 或指针 变量,例如:2 ?) _# @) q+ ^, Y3 Q: M
fputs(“abcd“,fp);% S$ }+ Q5 j7 f+ Y' D5 T* }
其意义是把字符串“abcd”写入fp所指的文件之中。[例10.5]在例10.2中建立的文件string中追加一个字符串。/ t6 p, L0 Z7 V" J/ Y
<FONT color=#009900>#include<stdio.h>
& W4 y* X5 W0 d- t" hmain() H0 Q5 f! Q* b
{ O8 J7 R' M& O, D! _2 v+ v
FILE *fp;
2 f+ D+ K/ w9 g3 `- }4 Jchar ch,st[20];
/ Q2 m* Y, J2 w3 e4 Vif((fp=fopen("string","at+"))==NULL)
: _+ X9 _8 D- H: ~{+ \0 b& y( J7 X
printf("Cannot open file strike any key exit!");
+ I& b9 x! ^- L5 p! Y& O9 {getch();' s6 L" Y, S1 j" D9 A9 o; |3 y( L
exit(1);3 b) R# \' s) M4 m% i: v, Y
}& t7 ^4 g7 J8 Q: Z9 j( x
printf("input a string:\n");9 w$ o) M3 \9 L5 C- a
scanf("%s",st);5 X/ ?) ^$ V) ^. l
fputs(st,fp);
Y( b" W" P, C/ G9 Erewind(fp);! Y7 G3 n% x# P2 A+ M% N3 [( |
ch=fgetc(fp);
5 z2 T! o2 y% F( k1 ^" c4 a8 w9 l7 twhile(ch!=EOF)
! N6 Q& @5 ~8 c' f1 G* \2 O{
) U" \/ D1 q2 }) X( H, ^1 Nputchar(ch); d0 I$ _% s4 f+ r9 l7 f" p' a. D
ch=fgetc(fp);
1 T1 a8 K% Z, N; f5 j}& P+ m6 s9 d4 E6 U4 R% o- M
printf("\n");
1 C, c% Z2 z, k# a# Rfclose(fp);
3 p! o* t( t- q( s}</FONT>" y7 g+ P1 z3 @
本例要求在string文件末加写字符串,因此,在程序第6行以追加读写文本文件的方式打开文件string 。 然后输入字符串, 并用fputs函数把该串写入文件string。在程序15行用rewind函数把文件内部位置指针移到文件首。 再进入循环逐个显示当前文件中的全部内容。
, l2 g( j* R2 O# a
! D* Y9 j& U1 s<FONT color=#ff0000>数据块读写函数fread和fwrite</FONT>7 p1 Q8 H0 B& _
* F5 C) R" G! b- `) P C语言还提供了用于整块数据的读写函数。 可用来读写一组数据,如一个数组元素,一个结构变量的值等。读数据块函数调用的一般形式为: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。
/ k5 Z+ X& k3 e3 F例如:
+ P0 Q/ t% k! D! e; U$ _# K. Wfread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。3 h3 N1 d5 H" S4 J
[例10.6]从键盘输入两个学生数据,写入一个文件中, 再读出这两个学生的数据显示在屏幕上。6 ^- l( y. b9 P% j# F+ J
<FONT color=#009900>#include<stdio.h>
8 C4 N. { D& J: \; ?5 _struct stu9 O4 H+ r4 T% F
{
, \3 ]4 {# G- F) h( [9 a8 \* Lchar name[10];% R( D: |( ^/ c* D Y; P9 `/ @
int num;
* P8 H7 @ v5 c" m1 Aint age;# @2 y, j4 \3 V
char addr[15];) s9 W/ p: Z) O, m3 [$ X
}boya[2],boyb[2],*pp,*qq;
. F, f, W. x. z) Pmain()! \0 ~3 \. \! p3 E+ C5 @% ^
{* v5 U8 p6 {. G, B7 c
FILE *fp;( k5 {* P3 G' u' h9 a7 w
char ch;0 c/ P: F; _0 O7 m4 D" s
int i;; s# h0 b) y7 O6 s1 p3 M, ~ m
pp=boya;
9 {: ^& R- T! cqq=boyb;/ n1 H: N! L" v R3 Y
if((fp=fopen("stu_list","wb+"))==NULL) u, v) l% G+ U- |
{* ~4 ^7 |" j3 K) A
printf("Cannot open file strike any key exit!");
& F* f! L+ j4 W N, Ygetch();
, w. z* t8 c5 A- h1 y% Eexit(1);* e4 D, z* o8 ~ V7 J- s
}0 K1 `0 b6 I/ N& a. z" |
printf("\ninput data\n");4 p$ D% D9 h& ?2 D$ X
for(i=0;i<2;i++,pp++)
$ Q% d, y* i* L; ~0 c+ escanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
% S7 B6 ] J+ F) B: F0 Opp=boya;8 @3 ]: b! c1 V% Y
fwrite(pp,sizeof(struct stu),2,fp);
. @! R' \- z0 Q' _, k: q8 Zrewind(fp);
& {$ o4 d* F! v! o" I* h- Rfread(qq,sizeof(struct stu),2,fp);" z9 K2 g. V5 I9 T; i
printf("\n\nname\tnumber age addr\n");# ]3 M* q7 ?8 a; ? x& b
for(i=0;i<2;i++,qq++)
- [; q j4 R2 \4 K3 R9 ~' ~7 sprintf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr);
, n9 }6 m3 t3 `- Y0 Yfclose(fp);
9 h' T. f9 U: E9 }4 q4 i}</FONT>
7 G! G& }5 h( X2 N4 y- ^/ N 本例程序定义了一个结构stu,说明了两个结构数组boya和 boyb以及两个结构指针变量pp和qq。pp指向boya,qq指向boyb。程序第16行以读写方式打开二进制文件“stu_list”,输入二个学生数据之后,写入该文件中, 然后把文件内部位置指针移到文件首,读出两块学生数据后,在屏幕上显示。; \' i4 e" \1 c! o0 J& y5 S9 C/ @5 V
8 N: q; |, N9 @$ F$ _: x0 ?7 X6 ?0 q<FONT color=#ff0000>格式化读写函数fscanf和fprintf</FONT>! h4 X( k, H' o% e
7 ^! D2 Y8 K# s/ Tfscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为: fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 例如:+ u" F9 b( j D3 P, M+ i: X" h
fscanf(fp,"%d%s",&i,s);2 N( ?1 H5 I) U! Y6 b" J+ P
fprintf(fp,"%d%c",j,ch);
9 |% J M( A1 g4 z" G6 o: k用fscanf和fprintf函数也可以完成例10.6的问题。修改后的程序如例10.7所示。
: b! w& y+ p( Q, w[例10.7] G2 E x+ Q- B7 b
<FONT color=#009900>#include<stdio.h>
0 E( D B# O% J6 t" S3 rstruct stu
. b& f0 F) f& r: |4 D8 ^{( S/ y* u: R1 r! }
char name[10];
* d c' T7 H: T! r6 aint num;
/ q7 ~7 u# I) I* x. ] A0 x2 d* hint age;& c- y5 g0 t$ k# s/ n
char addr[15];
0 Q2 z0 n$ L; ^4 Z" s4 u}boya[2],boyb[2],*pp,*qq;
1 h& l5 E6 H: |& a) y& wmain()
; A% w% ]1 x5 h `% z{
8 s! T8 ?1 ]0 Z dFILE *fp;: \4 m$ e$ ?% K9 n$ s2 z6 Z
char ch;. a/ M( n$ U- i# f, d- u
int i;
2 q5 [& d9 F W1 kpp=boya;9 ?4 y# `2 C; U4 c. F0 f9 B
qq=boyb;
% X( ?$ ~$ q$ _2 @& U o T3 lif((fp=fopen("stu_list","wb+"))==NULL)8 ~3 d, j- v9 U
{
' D2 y3 f$ N' _printf("Cannot open file strike any key exit!");4 @" w: H& a2 F
getch();- }5 m1 B9 H8 D' g$ t1 T/ p5 B
exit(1); h2 C6 I8 L) H4 h" A( b# g. g
}
8 V. t+ ?; s- A% Wprintf("\ninput data\n");; ?* a }/ I. D* Z! `+ b0 v# l/ H1 s
for(i=0;i<2;i++,pp++)
' Q# G: G' @1 sscanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
+ a7 }$ `9 N1 `8 E* wpp=boya;
/ N5 p( I" Y' X. rfor(i=0;i<2;i++,pp++)
- V' @$ u' @9 G4 ofprintf(fp,"%s %d %d %s\n",pp->name,pp->num,pp->age,pp->- B* s- b2 i8 K7 v
addr);# F) ~; ?8 z$ B5 `) ]0 r7 e
rewind(fp);
' f: Q2 o' t8 b R- _' e. Z8 Nfor(i=0;i<2;i++,qq++)
3 \- [* r( c/ b" ]* H6 ?( Afscanf(fp,"%s %d %d %s\n",qq->name,&qq->num,&qq->age,qq->addr);" N) Q0 ~$ m/ x: A
printf("\n\nname\tnumber age addr\n");
, ^. |; T% T! V+ r/ kqq=boyb;3 s4 n4 }7 Y9 j1 I5 \/ ]
for(i=0;i<2;i++,qq++)
, O/ ]3 V( I/ {7 p hprintf("%s\t%5d %7d %s\n",qq->name,qq->num, qq->age,
+ n+ [9 i6 _3 `9 mqq->addr);
4 t2 o, y& M0 A4 C, I6 Yfclose(fp);& \ _- j1 i. O
}</FONT>& D% G8 ~7 U2 C
与例10.6相比,本程序中fscanf和fprintf函数每次只能读写一个结构数组元素,因此采用了循环语句来读写全部数组元素。 还要注意指针变量pp,qq由于循环改变了它们的值,因此在程序的25和32行分别对它们重新赋予了数组的首地址。
/ Y' K: {$ i: E) i. S
1 B6 e+ `" ~% M4 x/ o# o<FONT color=#ff0000>文件的随机读写</FONT>
7 u# }5 u4 g9 |# A; ?+ a
! [' Z% l+ `/ Y# _/ s$ b! C n 前面介绍的对文件的读写方式都是顺序读写, 即读写文件只能从头开始,顺序读写各个数据。 但在实际问题中常要求只读写文件中某一指定的部分。 为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。 实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有两个, 即 rewind 函数和fseek函数。
( O1 M7 L P6 Q7 q- R) |
' z& W5 Y5 w0 z. Q; F/ t rewind函数前面已多次使用过,其调用形式为: rewind(文件指针); 它的功能是把文件内部的位置指针移到文件首。 下面主要介绍/ Z! w' j6 ~1 c* \1 ^/ Q
fseek函数。
. B, P5 U) L: Z( v% C
& C+ d/ D% i2 {0 `" u. c fseek函数用来移动文件内部位置指针,其调用形式为: fseek(文件指针,位移量,起始点); 其中:“文件指针”指向被移动的文件。 “位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。
3 p6 k0 _, {( q其表示方法如表10.2。
; e/ [$ T0 a- [+ r2 G# ]7 T4 v起始点 表示符号 数字表示3 e/ Z! i$ s7 t9 m% ^" f
──────────────────────────
! k. e( P+ \6 W- s( a文件首 SEEK—SET 0, m% [* B. r: c% B/ ] Y# P
当前位置 SEEK—CUR 1+ x: j7 O2 A3 V
文件末尾 SEEK—END 22 u" X J. I9 i: B; _. }
例如:
2 o# [: ]8 [2 V, g' Q7 yfseek(fp,100L,0);其意义是把位置指针移到离文件首100个字节处。还要说明的是fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。文件的随机读写在移动位置指针之后, 即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。下面用例题来说明文件的随机读写。
+ w$ x- o2 r* k4 x) M4 P0 s
8 a& @: o( a: k- z7 V0 i<FONT color=#ff00ff><B>[例10.8]</B></FONT>在学生文件stu list中读出第二个学生的数据。
& o9 K- w6 {0 A. H' d<FONT color=#009900>#include<stdio.h>- X$ j0 a. K: W$ h+ n3 F8 U
struct stu1 @% S6 M' l: M" z3 I+ p
{ E, C) q5 @( J6 S$ _- G
char name[10];: N; N- _7 @8 @: g5 g* r% B7 J
int num;* _1 K, u" u% w' J' [7 v
int age;/ g$ ?" B2 v0 ]: {% |& A% @
char addr[15];" ~- }, A3 w1 a; W* P, N! m
}boy,*qq;# B' V9 ^0 m" j4 _; z' T$ j
main()" F' O4 g" @" U5 B
{
& E l2 \5 Q- m9 w# |4 {- T4 ?FILE *fp;7 m2 I- m% `0 n+ E& M4 U7 }. Y
char ch;
% o8 o. A* V! H) {' ^4 nint i=1;; w& Z4 v# K# j# y ?. K
qq=&boy;
0 s1 b/ D# R! {if((fp=fopen("stu_list","rb"))==NULL)
& }: T( O5 K5 _% O$ i9 ?" e2 v5 s{7 E" s( ]' T4 h% c* Z; P8 w
printf("Cannot open file strike any key exit!");
& A" [" {0 A# g' C$ S/ Y8 _5 \# Jgetch();
, z7 i, z1 [& i6 qexit(1);* Q8 H# d1 x0 q* y9 Q+ M" k) V- t
}' ~- |' L n5 \" D, `! c
rewind(fp);6 D$ U9 ]# w+ K$ E. v
fseek(fp,i*sizeof(struct stu),0);5 P8 G+ G; Z% H
fread(qq,sizeof(struct stu),1,fp);
! E4 m" P3 y8 uprintf("\n\nname\tnumber age addr\n");7 j# K& E* m0 O' @ C3 K- U9 Z
printf("%s\t%5d %7d %s\n",qq->name,qq->num,qq->age,
4 Q* q8 m: y" B# A$ `1 e0 {9 bqq->addr);
0 r! Z' a1 z1 r2 A" [2 j}</FONT>
$ o) V" F/ R, @2 Q; N 文件stu_list已由例10.6的程序建立,本程序用随机读出的方法读出第二个学生的数据。程序中定义boy为stu类型变量,qq为指向boy的指针。以读二进制文件方式打开文件,程序第22行移动文件位置指针。其中的i值为1,表示从文件头开始,移动一个stu类型的长度, 然后再读出的数据即为第二个学生的数据。1 L5 x6 F% D( i: @" `5 P8 G
+ {3 J# T- R9 h9 \6 J0 r
<FONT color=#ff0000>文件检测函数</FONT>
0 R* \! ~6 H$ E* Q U* {! w
# g \7 O7 Q0 UC语言中常用的文件检测函数有以下几个。! Q- c! X; r0 L$ V
一、文件结束检测函数feof函数调用格式: feof(文件指针);
( n6 q. J- R& ~. F功能:判断文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。
9 M# t# n$ c1 [" {) }$ L( Q. i3 |
) w* Q) u- _2 U' b9 @( v( o+ A二、读写文件出错检测函数ferror函数调用格式: ferror(文件指针); # \ x% o6 m! ~ ?* g
功能:检查文件在用各种输入输出函数进行读写时是否出错。 如ferror返回值为0表示未出错,否则表示有错。
% j7 p' o* x0 A6 S, Z4 N7 g; u0 u+ p; w$ I, V9 c- j
三、文件出错标志和文件结束标志置0函数clearerr函数调用格式: clearerr(文件指针); $ h6 n) U I b1 r
功能:本函数用于清除出错标志和文件结束标志,使它们为0值。
1 }* p: S. h( l1 h. }: T/ B" S( {4 m* G+ u) k' c- c
<FONT color=#ff0000>C库文件</FONT>7 w- }0 \% C. A9 u
2 _ Y. ~( w1 d( q! @ v
C系统提供了丰富的系统文件,称为库文件,C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件, 在前面的包含命令中我们已多次使用过。在".h"文件中包含了常量定义、 类型定义、宏定义、函数原型以及各种编译选择设置等信息。另一类是函数库,包括了各种函数的目标代码,供用户在程序中调用。 通常在程序中调用一个库函数时,要在调用之前包含该函数原型所在的".h" 文件。" D8 t* ^# [' q9 X
在附录中给出了全部库函数。+ {$ I* i4 H4 Z
ALLOC.H 说明内存管理函数(分配、释放等)。
- i0 {: q- I! Q5 aASSERT.H 定义 assert调试宏。
* E" Z" y1 N- A; m) |5 mBIOS.H 说明调用IBM—PC ROM BIOS子程序的各个函数。
4 q% a0 E' k4 H" x3 yCONIO.H 说明调用DOS控制台I/O子程序的各个函数。# i0 u" S9 D/ Y& b$ r' c7 g& j: h+ |7 b
CTYPE.H 包含有关字符分类及转换的名类信息(如 isalpha和toascii等)。. W) w. s k l2 d: A/ e
DIR.H 包含有关目录和路径的结构、宏定义和函数。
% g; w0 Y% R' B( tDOS.H 定义和说明MSDOS和8086调用的一些常量和函数。1 ^# Z0 }4 [' q8 m4 c3 G/ z3 Z! M
ERRON.H 定义错误代码的助记符。) i! G+ H1 f; g { l$ K3 D' h
FCNTL.H 定义在与open库子程序连接时的符号常量。/ p' Y% J, ^/ W$ e! Z' f
FLOAT.H 包含有关浮点运算的一些参数和函数。
7 E' z! d+ w+ i* ]GRAPHICS.H 说明有关图形功能的各个函数,图形错误代码的常量定义,正对不同驱动程序的各种颜色值,及函数用到的一些特殊结构。$ Q! ]- m7 w8 E# j- ~' U
IO.H 包含低级I/O子程序的结构和说明。 I0 `; |! r% ~; K8 o- s- ?" k
LIMIT.H 包含各环境参数、编译时间限制、数的范围等信息。' O+ d- Z6 G) c% ]5 L' F
MATH.H 说明数学运算函数,还定了 HUGE VAL 宏, 说明了matherr和matherr子程序用到的特殊结构。
1 f# J- m3 m& c% n* Y9 M' l1 d0 uMEM.H 说明一些内存操作函数(其中大多数也在STRING.H 中说明)。# z* w+ k6 t& `" s8 X" T
PROCESS.H 说明进程管理的各个函数,spawn…和EXEC …函数的结构说明。
4 y$ o. G# K* ]7 o4 B/ OSETJMP.H 定义longjmp和setjmp函数用到的jmp buf类型, 说明这两个函数。: W, b; Y# N$ ^! t9 l0 u9 f9 z) o
SHARE.H 定义文件共享函数的参数。
4 o% n' Q2 w: F* m/ \- O6 OSIGNAL.H 定义SIG[ZZ(Z] [ZZ)]IGN和SIG[ZZ(Z] [ZZ)]DFL常量,说明rajse和signal两个函数。7 D. u* _5 b5 p9 {+ D* C1 \
STDARG.H 定义读函数参数表的宏。(如vprintf,vscarf函数)。; |, M5 }3 ^- x- D& i! s- |
STDDEF.H 定义一些公共数据类型和宏。8 Y- U; I/ Q( w; R' k' a M" S
STDIO.H 定义Kernighan和Ritchie在Unix System V 中定义的标准和扩展的类型和宏。还定义标准I/O 预定义流:stdin,stdout和stderr,说明 I/O流子程序。8 S6 [ ^; S0 v! n: {
STDLIB.H 说明一些常用的子程序:转换子程序、搜索/ 排序子程序等。0 R: L: v9 \* B+ q4 |
STRING.H 说明一些串操作和内存操作函数。+ z. M5 a$ d" M# r6 W+ W Z* a
SYS\STAT.H 定义在打开和创建文件时用到的一些符号常量。/ r" t) Y- I, ~7 n7 i' j
SYS\TYPES.H 说明ftime函数和timeb结构。& O4 e. P, J1 u3 Y& ^
SYS\TIME.H 定义时间的类型time[ZZ(Z] [ZZ)]t。" |3 X0 _( r- g' R5 u
TIME.H 定义时间转换子程序asctime、localtime和gmtime的结构,ctime、 difftime、 gmtime、 localtime和stime用到的类型,并提供这些函数的原型。- H: Y0 {! Q. t' }; W8 x
VALUE.H 定义一些重要常量, 包括依赖于机器硬件的和为与Unix System V相兼容而说明的一些常量,包括浮点和双精度值的范围。) Y3 D- J2 K: {$ h/ X9 ?
% L* W t* V4 S* J; i+ b- J<FONT color=#cc0000><B>本章小结</B></FONT>
" d8 {8 N% v& f' V4 C
- K9 W' ~5 w) {1. C系统把文件当作一个“流”,按字节进行处理。 8 |/ Q( F, Q* ^
9 w5 A. ~4 F3 d5 j0 w2. C文件按编码方式分为二进制文件和ASCII文件。; K7 |6 ?& \, W) a4 W6 C
+ C6 t; T5 k+ R$ W+ X/ v3. C语言中,用文件指针标识文件,当一个文件被 打开时, 可取得该文件指针。
2 \& Y4 d, B" p4 b/ L3 b5 `, L o( e( @* y* z2 q/ H
4. 文件在读写之前必须打开,读写结束必须关闭。3 x8 j2 V' b# i
$ h. J1 x' B L9 f5. 文件可按只读、只写、读写、追加四种操作方式打开,同时还必须指定文件的类型是二进制文件还是文本文件。' W0 @" m- P z( R
+ ?" _/ [7 u0 B/ O4 J- j
6. 文件可按字节,字符串,数据块为单位读写,文件也可按指定的格式进行读写。$ j; G9 {3 E3 a4 ~0 h# u P
1 J1 X0 X$ b$ V7 i( B
7. 文件内部的位置指针可指示当前的读写位置,移动该指针可以对文件实现随机读写。</P> |
|