QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作 $ b& x, N3 N0 v* T( j
  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>5 @' S8 a0 U5 Z5 k. P. H
<>一、流式文件操作
8 c4 r2 f# ~/ G% K  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>
5 t- G( L/ z6 F' ]7 {6 s. P- X1 s<>typedef struct {1 Z4 K$ ~: ?# t! q0 v, w% l  z$ Y
int level; /* fill/empty level of buffer */( S' _& X/ Y7 \! D# E* I5 g, }* V
unsigned flags; /* File status flags */6 ?; h: E5 L0 D5 c
char fd; /* File descriptor */
9 c& G. ?3 K/ i2 s& ]1 Lunsigned char hold; /* Ungetc char if no buffer */
, Y( z0 s% Y2 E# w4 x$ kint bsize; /* Buffer size */8 j- N* U! x; z6 F! u4 p7 f
unsigned char _FAR *buffer; /* Data transfer buffer */
" [. q# h$ L: c0 g1 s0 X( eunsigned char _FAR *curp; /* Current active pointer */" N% Q1 f% b. n" s% k
unsigned istemp; /* Temporary file indicator */5 ~) S  n# X4 [5 G3 m
short token; /* Used for validity checking */* L+ `% \- g7 H8 L  f
} FILE; /* This is the FILE object */</P>
" K) T& S9 {5 k! \8 u<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能
. R+ K0 E/ H2 ?# g/ ffopen() 打开流
5 h7 O+ y. G% P, ^" C+ ^4 mfclose() 关闭流
! X$ P: h+ R$ ?5 u) R. Xfputc() 写一个字符到流中 , b$ j& K! l: k. z9 N% i3 |
fgetc() 从流中读一个字符
! h. K! V0 U* X. E4 N7 dfseek() 在流中定位到指定的字符
4 B5 s4 j- ]+ p- H4 W' dfputs() 写字符串到流 ) r. t/ a' @9 Q* I: f* n! v
fgets() 从流中读一行或指定个字符
" [1 ?% I! i) ]& Lfprintf() 按格式输出到流 5 ?- m& p: W1 a( W4 ?
fscanf() 从流中按格式读取
8 v4 F1 ~4 a1 ^+ C8 L4 vfeof() 到达文件尾时返回真值   X3 U; \2 |4 t3 d  Q3 t  w6 k
ferror() 发生错误时返回其值 ' j+ A( ]1 x! O8 [: A8 a- \
rewind() 复位文件定位器到文件开始处
: p2 m: o+ i. V% v+ lremove() 删除文件
  e  M2 ]. _9 o+ I( w7 j# s1 \fread() 从流中读指定个数的字符 5 I% N6 \* y4 z/ U
fwrite() 向流中写指定个数的字符 1 h( @% b6 V1 \5 k" ^$ b2 t
tmpfile() 生成一个临时文件流
3 u; u0 A* r: l9 @" j- c# otmpnam() 生成一个唯一的文件名 </P>
( k- H3 C$ O1 }5 l/ A<>! b' l: H% M6 @) u  K
  下面就介绍一下这些函数</P>
- `% a4 B- E) o1 @<>1.fopen(), \- S3 J2 c' l; _3 s
  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>
. G: ~* _; {* r4 b# a* P<>为使用而打开一个流
- |. b9 }$ S: M1 C$ @. P把一个文件和此流相连接 : U$ A& b7 u+ X0 p7 w9 c# ^- |
给此流返回一个FILR指针$ G9 L( z% C! T: j0 L* o' G# q
参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>* p. O) Z# R  o: Y( t0 M
<>字符串 含义 3 B1 |& R% y  Y2 U! R
"r" 以只读方式打开文件 * ~7 H4 J* P' @. K* J
"w" 以只写方式打开文件 - v3 u6 k) x1 c4 O* @/ h
"a" 以追加方式打开文件
- C% ]# E* I  M% C: Q" O"r+" 以读/写方式打开文件,如无文件出错
; ]4 U, J) \/ a. t"w+" 以读/写方式打开文件,如无文件生成新文件 </P>, ^1 z* q5 I# Q* w
<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>
. R, v" |3 Q3 j<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>4 Q8 k" v7 T% t7 k8 {  ^. E, m* i1 L) p
<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>
2 E, u: o* H- ~6 I, j9 ]<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>4 [9 S) B& F* K2 y% X, `% V' }
<>例:</P>$ x; v; a  a' C: ]% ^; V, k
<>  FILE *fp; : R% v) a  h" ]# h0 n
  if(fp=fopen("123.456","wb"))
+ N( U* E0 D* _/ T' E    puts("打开文件成功");+ G# ?3 M3 Z! Z% R! n" H1 I
  else
3 e4 ]8 l$ p2 d9 F    puts("打开文件成败"); </P>) F" ^8 X" s, o+ k( _
<>2.fclose() 2 T% `/ f( }& P- i! ~; I# \
  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>
) n. q; c2 B4 _& V0 g( p/ d) ^<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>9 S! ]0 o9 r0 q6 x! V1 U
<>例:fclose(fp);</P>
6 s3 x$ a* t6 s. b9 \<>3.fputc()
5 ?  t9 S- v4 V0 I# h0 u+ R" D  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>3 R% K5 \% p+ O
<>例:fputc('X',fp);</P>& I4 j/ A2 h4 D  _6 F
<>4.fgetc()
. k0 b4 \8 |; O% f, ^  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>2 ?) r3 o' @0 n2 Q3 v9 N' A7 y
<>例:char ch1=fgetc(fp);</P>
6 b; L; U5 e$ ^  U& V1 a<>5. fseek()
1 J0 ^# b% I  N( u( C9 O  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>" v  ~! h! z+ t0 e" r( x4 L8 ~
<>符号常量 值 基准位置
  c( q& Z5 x. S( SSEEK_SET 0 文件开头 ! B* ]- H, ~: {" f
SEEK_CUR 1 当前读写的位置 1 p7 Q6 W9 D2 R/ T( ~% Q
SEEK_END 2 文件尾部 </P>
! K3 Z2 {3 k; z<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P># o0 u2 E7 E, c$ m2 d
<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>
' q8 b7 m. H" X9 k5 z( t<>6.fputs()) H  W  d8 B! U  O& q
  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>
3 Y8 M$ q- a1 I2 d<>例:fputs("I Love You",fp);</P>
+ o/ M! y* K- j( I* v1 R) B<>7.fgets()
3 ?3 w8 e0 H8 S, I! a  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>, j" Y$ o9 D0 N! v0 P
<>例:如果一个文件的当前位置的文本如下</P>' [. k  w/ @8 f8 O$ m8 ]
<>Love ,I Have</P># F/ u& ]' {4 U2 o$ D2 j1 Z
<P>But ........</P>% ^' s' L% I0 x1 {' @% r
<P>如果用</P>( O( E  D: b/ Z; t; I. K+ q8 e
<P>  fgets(str1,4,file1);</P>; W) N1 c0 [0 B# t" O
<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>
7 Z9 N% Y/ G! A9 K<P>  fgets(str1,23,file1);</P>7 U4 A+ f3 w2 R" Z1 D2 u8 R* c. f4 o# W
<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P># W7 x0 Z% r! W) q7 S
<P>8.fprintf()' _  d# M- J2 ?7 ^1 h' R& G1 Z% P
  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>+ n  V% e4 N# J2 j' _/ H8 H
<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>+ W# ]( [8 e0 H% _- [/ n! ^- P
<P>9.fscanf()6 y! q3 r/ c2 o. R4 Z" ?% H
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>, h9 a5 e- p5 T6 R' Y
<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>$ z9 q! x+ A6 p7 }9 P+ C
<P>10.feof()* S6 W, ^' X' T& Y
  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>
( N6 S- @# |9 M. k' f  \8 o3 \<P>例:if(feof(fp))printf("已到文件尾");</P>/ z& y' l% [* b$ Z. Y" ?0 |7 C
<P>11.ferror()
! K% o! `& G' A2 j  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>' T) C5 o, k" P. w1 z' s
<P>例:printf("%d",ferror(fp));</P>4 g9 Z$ H' v& c  N
<P>12.rewind()+ R: ~+ s- Y" `: M! w5 f
  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>
3 i) F4 E" D! T5 j  y<P>例:rewind(fp);</P>
' ?: m2 z0 ^! k) M<P>12.remove()
; b  Q6 l4 `4 f+ ?  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>) L$ U2 y, Q/ }+ m4 \) \7 H
<P>例:remove("c:\\io.sys");</P>
. Y% G" U+ B; Z8 m3 m/ _<P>13.fread()
! w& q  `- ]$ E+ w/ y  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>) T8 ]" l: L( v4 S3 m6 W
<P>例:</P>. ?; l& ]( L9 N" f$ f0 M0 e( t
<P>  char x[4230];; i- y8 U- C! a  }4 k4 l/ m5 d
  FILE *file1=fopen("c:\\msdos.sys","r");
, ?0 Y' u" Y; ]8 d# `  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>7 a, s; i5 B! ]6 g# C  X
<P>14.fwrite()
. U( L% u- c0 K& @1 T5 K  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
$ I+ o; I9 C( n) Q% M<P>例:</P>
0 r2 N* q3 r" {3 t<P>  char x[]="I Love You";- ^, q4 F5 @8 E( B: p! Z' Q: Z
  fwire(x, 6,12,fp);//写入6*12=72字节</P>4 x/ ^' }% V0 E% n
<P>  将把"I Love"写到流fp中12次,共72字节</P>
' D8 n: y4 T7 c# I<P>15.tmpfile()
6 ]3 F9 e0 J- g2 c* D5 t! o  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>0 t" Y% ?; }0 }# R/ P
<P>例:FILE *fp=tmpfile();</P>
) n' ^& \, i( E! \<P>16.tmpnam();
7 k  M  f4 [- G. W2 F  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>
& I- m$ _4 W  ]* B. h; d; o) {) ]* G6 @; C
<P>
5 M# U2 X4 O1 V' @0 b6 t </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-4-21 17:16 , Processed in 0.405989 second(s), 56 queries .

回顶部