QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5194|回复: 0
打印 上一主题 下一主题

borland c++ bulder的文件操作总结-1

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作
8 m7 n8 y; g( m1 T5 x* M  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>4 }1 `/ ~5 f* T% f
<>一、流式文件操作* P$ I. k1 x- e. G0 J# R$ D
  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>
8 Y2 S& |5 T( r6 B" @7 ?<>typedef struct {* z" X# t! p  z5 y! y  \; h4 X
int level; /* fill/empty level of buffer */9 s' ?) m6 ?9 U% e7 F
unsigned flags; /* File status flags */
/ N" z2 S# U! |: U' h5 c; kchar fd; /* File descriptor */. }8 A# l3 w! }# _$ |
unsigned char hold; /* Ungetc char if no buffer */
! v: [% m* f) mint bsize; /* Buffer size */
1 X& ?& `! }( E) T2 H1 G3 junsigned char _FAR *buffer; /* Data transfer buffer */2 i3 L2 R5 w: O
unsigned char _FAR *curp; /* Current active pointer */
6 c  }& c6 G$ I9 @" ^: nunsigned istemp; /* Temporary file indicator */
3 q! ~+ d0 W) Q+ n! y" N0 N5 V# z0 eshort token; /* Used for validity checking */
( s; ]: k. X+ C} FILE; /* This is the FILE object */</P>
5 C( Q1 f: V$ W) `' v. T<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能
( C/ m9 \" z5 D2 m/ G( x+ efopen() 打开流
  F* a: n2 s2 V# K" ?; Wfclose() 关闭流 0 a, H9 F. g* V. a
fputc() 写一个字符到流中
9 A" `' u3 f% |' M$ @* k5 y# F1 J$ B2 efgetc() 从流中读一个字符
: i. D5 T+ P8 K" Q0 vfseek() 在流中定位到指定的字符 * \& T; ^4 O+ }* Y! e
fputs() 写字符串到流 ! D) B" Y5 G2 u  g
fgets() 从流中读一行或指定个字符 + D, J) k! l! R# Y! v
fprintf() 按格式输出到流 % j5 l" h. Q# f% `  g. w
fscanf() 从流中按格式读取 " k8 N$ r: G) V3 Z* W
feof() 到达文件尾时返回真值
7 b! Z: O/ V+ n4 e) R5 C- dferror() 发生错误时返回其值 ; B' n6 i7 `2 T' l
rewind() 复位文件定位器到文件开始处
8 K) N5 q# e& f4 e, J! p3 Jremove() 删除文件 5 C7 m; `& [% M$ T3 C+ w7 W2 }. Z
fread() 从流中读指定个数的字符 : f# F% [# B8 \$ V: w, |% e
fwrite() 向流中写指定个数的字符
+ ?! a3 F) y% i+ ^7 J: X1 c" ftmpfile() 生成一个临时文件流 , H2 r, |% k7 i, F3 A" d& G; d
tmpnam() 生成一个唯一的文件名 </P>% \6 t. _# t. @/ r3 |6 |
<>$ {6 B) @9 Z/ d7 Q% q# p
  下面就介绍一下这些函数</P>
: a9 U' R' f5 ]) H4 E7 a# g<>1.fopen()4 `+ o, p9 p6 O, X8 |* C
  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>, j3 m# o5 d' B
<>为使用而打开一个流 0 E0 j# z) ^6 E
把一个文件和此流相连接
) T  C5 L- n/ E给此流返回一个FILR指针
8 l8 I4 ^- [2 j/ Y参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>2 b1 Z6 L+ U! g0 M( }" I( t8 m
<>字符串 含义 # F5 ?- E' r5 C; V
"r" 以只读方式打开文件 % u- w3 ~* b# d; F6 w
"w" 以只写方式打开文件 + d2 i# c) u6 H) j! t
"a" 以追加方式打开文件 " s$ t# w$ \3 q9 ~5 L
"r+" 以读/写方式打开文件,如无文件出错 8 ^( E5 O2 F# C) R8 }/ x& A* L8 w
"w+" 以读/写方式打开文件,如无文件生成新文件 </P>
& `# N9 r4 q, [& K<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>1 K, g# z4 x! H$ M9 _5 q
<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>  ]4 v% b, g( d/ L% ~" R$ @
<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>% b& k0 H2 c" @1 C/ J; [
<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>& [7 S, l. }0 b+ v
<>例:</P>- k- A4 y% l8 A0 K+ p  B, d8 v
<>  FILE *fp;
1 @0 O' l' ~: c8 m( m  if(fp=fopen("123.456","wb"))
$ g# u$ B% B+ |4 n$ h  Y    puts("打开文件成功");
% G! G$ a' R# I( M* {  else ! A) |% o* C1 Q" {8 s% j* ]8 r
    puts("打开文件成败"); </P>
4 ?4 D' j. e/ @<>2.fclose() . w) d9 M5 B" p4 y6 s% [
  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>
2 Y; i$ f& k% ^9 V6 t" |<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>1 ?4 P1 d* [) F8 g6 `1 b: r
<>例:fclose(fp);</P>
$ T6 d1 z! `( M. i% O4 \<>3.fputc()# d4 K( @5 p; i+ z/ _
  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>
0 l4 V  |- x$ Y: L& M<>例:fputc('X',fp);</P>
  h: ?  i$ L) u% {' L2 s! Z3 Z<>4.fgetc()3 l: j8 Q% ]8 X; \; g0 a: U3 w
  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>
, J( l/ R" c, M. ^0 r<>例:char ch1=fgetc(fp);</P>
7 ?2 k, W5 E6 S" }. d, n9 M* }<>5. fseek()* ~& L6 U0 i  T0 u& ~% C( p
  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>, P  ~3 c+ l1 Y$ T, z4 u  L
<>符号常量 值 基准位置
! N4 `. u6 M7 BSEEK_SET 0 文件开头 % ?+ [* [0 w, {  o( u
SEEK_CUR 1 当前读写的位置 : M8 _' V0 ^% H- L3 _4 A
SEEK_END 2 文件尾部 </P>4 p/ y6 s. Q% _' W6 e! m8 W( T& g
<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>  M! i# u9 ^% e5 v1 [' t
<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>
  c* H: H3 z+ B. b1 c5 f: l<>6.fputs()  |; G. j! e- Q$ q8 Q; S* N
  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>
" G0 \! i. v& w) J<>例:fputs("I Love You",fp);</P>
+ @) f; A) A5 l/ m7 O. P' Z* q<>7.fgets()  K# ?# N! {; w- Z( Q
  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>
1 z4 ]5 m0 i7 c" R2 u! @4 d<>例:如果一个文件的当前位置的文本如下</P>* c' r% \' Y9 a7 V$ X
<>Love ,I Have</P>& }7 A) B9 Q5 }5 m6 e: h- x. i
<P>But ........</P>3 d& T/ t+ u6 w: _( f
<P>如果用</P>; y- L; p( w/ a3 |
<P>  fgets(str1,4,file1);</P>* X5 m2 e- ~2 ]$ v/ f
<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>
1 E# t4 e. N3 K" T. d2 j<P>  fgets(str1,23,file1);</P>
; a9 f4 z. @0 q0 c6 |<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>4 u, n! }* u7 _8 m! ^
<P>8.fprintf()" U+ R& E6 W# z- d1 K
  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>( f. O3 J8 d1 ]+ Z- M" a) u( d
<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>! ?+ d) Q3 b6 s7 [# ^* H; J
<P>9.fscanf()( A1 b' N- k* H7 z8 f
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>
! H4 {2 N: P3 E- m<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>. B- e) h* J' O
<P>10.feof()
; }: H* _9 S& P  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>
9 C, {* U7 i  N: ^0 O) y<P>例:if(feof(fp))printf("已到文件尾");</P>9 R) Z/ q( g! V) I8 c5 F' U/ m+ V
<P>11.ferror()
. |7 k- F0 n# E3 m9 t  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P># a6 B0 G. L1 `. y2 Y! B
<P>例:printf("%d",ferror(fp));</P>
* Y* Z$ \, T8 S+ J2 R- J1 L. y<P>12.rewind()
" G9 r; g7 j6 g4 C  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>3 |1 N# ^8 i) H  G, n7 {' w
<P>例:rewind(fp);</P>5 `) \) W) k8 X& g1 x9 L- c& g; V
<P>12.remove()1 ^) q" y8 R! K
  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>2 f/ E1 [# \0 y
<P>例:remove("c:\\io.sys");</P>$ G& V8 z0 u: m, W1 R4 W. J* _" Z) D
<P>13.fread()5 ~% a% w- h7 t
  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>9 G3 `0 U$ w6 Z) m) Y" T
<P>例:</P>& ~2 k9 U. A) h! f8 t2 C) S
<P>  char x[4230];
6 n" i* H* R  {+ e/ K* z! z  FILE *file1=fopen("c:\\msdos.sys","r");, D  X) E" r8 q3 l9 @0 Q
  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>
4 T/ X0 w- M: R9 y6 a<P>14.fwrite()! Z/ W8 w- D, r9 t' P( A
  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
! ?* ?$ J9 j3 b9 G4 Y/ `: B* ?* e7 u<P>例:</P>7 ]6 z5 G7 w+ j/ b+ {# n/ v( ~. ?
<P>  char x[]="I Love You";
! |. v! P+ \9 @1 e+ y; m1 n  fwire(x, 6,12,fp);//写入6*12=72字节</P>
0 r! A( u% E" d5 v% }* {3 P<P>  将把"I Love"写到流fp中12次,共72字节</P>
3 e6 c6 H1 b; T! l<P>15.tmpfile()
, M3 H! k) q: o0 R- [% d  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>9 c; W; @( z3 z6 L! d/ L2 V
<P>例:FILE *fp=tmpfile();</P>
" @4 P! U; g: ]1 R6 z% P/ K7 M5 T<P>16.tmpnam();1 ~: L7 D/ i5 R2 f7 [+ Y8 I0 J
  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>' ], E+ i! z! N# s/ m/ e7 G; Y
0 b+ i9 w) e! E6 ~9 L2 z: n5 N
<P>" W/ ~8 U. F3 u+ g
</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-7-20 22:30 , Processed in 0.322095 second(s), 51 queries .

回顶部