QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作 0 J' r  h- `3 j/ Z( D9 H
  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>3 E: t0 i& ?: c+ @
<>一、流式文件操作
$ K) Z& q& y6 l& N9 L  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>* N* S# j2 j" Y) Z. U3 n7 u$ C5 f
<>typedef struct {9 O* k: `+ E2 ?6 r( }4 b0 K
int level; /* fill/empty level of buffer */
; |$ U1 E: Q9 F" l& Munsigned flags; /* File status flags */0 [8 [2 A1 v' E7 I$ ?+ Y. C: c" y
char fd; /* File descriptor */
8 T9 T. N: v. Q1 runsigned char hold; /* Ungetc char if no buffer */, }0 S; L& G# m
int bsize; /* Buffer size */
1 Q) `' K6 G  m* i: {! Gunsigned char _FAR *buffer; /* Data transfer buffer */
; ]6 c5 ~( N5 q- Cunsigned char _FAR *curp; /* Current active pointer *// L- H9 }$ d7 O1 v, {% d' K
unsigned istemp; /* Temporary file indicator */
1 {2 D& ^( ^: {" \! v4 d  z1 Fshort token; /* Used for validity checking */7 x+ ?; v5 }9 s4 y, _4 S
} FILE; /* This is the FILE object */</P>
9 r) g+ X, @! \) @: A+ ]. a<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能 5 s. r+ e$ [  X; o! I
fopen() 打开流
2 f2 x* [* x5 N) xfclose() 关闭流 - g2 Q( N& u! u2 a
fputc() 写一个字符到流中 0 f$ u2 [0 M1 C4 \7 d2 l" v9 x
fgetc() 从流中读一个字符 * `3 M4 U1 F5 `1 E4 O( I0 f
fseek() 在流中定位到指定的字符   ^9 h. n# y9 d/ Z" n! P9 d
fputs() 写字符串到流
; b0 y& a- }9 G9 l5 O! Hfgets() 从流中读一行或指定个字符
7 s+ |' ~  i. r5 w7 g  u- V& Vfprintf() 按格式输出到流 ; S; [* B8 A+ N7 J/ x
fscanf() 从流中按格式读取 - h1 ~( G9 Q5 _
feof() 到达文件尾时返回真值 8 ~. Z" o0 S! o- w" J3 P
ferror() 发生错误时返回其值
: a# {/ m, i$ _rewind() 复位文件定位器到文件开始处 # C# x- C* o+ ]7 S+ ?5 P- w$ |
remove() 删除文件 / f  c; x: u, k5 P. i
fread() 从流中读指定个数的字符
% q# Q  y* n. z; f8 T( A4 `: Dfwrite() 向流中写指定个数的字符
: R' T6 f7 O; Q2 a: e. c9 ztmpfile() 生成一个临时文件流
6 Z  H' x( v) `, ]6 c- V( D% qtmpnam() 生成一个唯一的文件名 </P>
  d' `" d" \! @/ r( k1 M<>4 k/ T4 Z7 P6 C7 z4 X; d& Q
  下面就介绍一下这些函数</P>; I8 {6 Y8 d$ E+ M8 _  L
<>1.fopen(). D  }, N8 l5 f# F7 O0 R
  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>
! V" G) r# m2 ^" p- r; `" X; T* x<>为使用而打开一个流
( [- }* U7 P0 T; W& J5 J把一个文件和此流相连接
8 O1 y1 W+ T$ v8 V( |# p' a给此流返回一个FILR指针
0 g! A' z( g3 M参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>3 p: o2 b' z7 }  b8 C: K9 I8 o0 ?/ B
<>字符串 含义
8 }6 A; w  Y7 v1 d$ O2 G" r"r" 以只读方式打开文件 4 n( c5 ?1 o) F" ^6 [# H
"w" 以只写方式打开文件 # b- m8 _' X% R- d, h0 O* I1 W1 D
"a" 以追加方式打开文件
( K2 ]" k" ]; S7 \, n' D" X4 a! K"r+" 以读/写方式打开文件,如无文件出错 ( Q, @; W. \) d/ @- X
"w+" 以读/写方式打开文件,如无文件生成新文件 </P>
0 _# w7 ?/ ?6 ], r6 U' T+ y2 |# }$ b<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>
/ d* V0 ]# l3 v, |" ~4 W) W<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>2 m7 ^0 T0 G$ g  v. j) Z* H8 l
<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>' u, H( _' i  }* q! S3 W4 ~4 v
<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>
( G( `. K5 c8 Z7 @! }<>例:</P>
  J1 n7 i( n9 E2 r; D. u<>  FILE *fp; & V) v/ z  k( V; T0 w9 G7 Q4 Q
  if(fp=fopen("123.456","wb"))
  f/ M# n; c" l9 X! P4 I: F    puts("打开文件成功");
8 C, s8 F9 d6 ~2 U0 Y  else 0 ?& h9 P) [, ~+ E  R
    puts("打开文件成败"); </P>
5 b8 k2 y. N* Z1 w" B7 O<>2.fclose()   W9 m. g0 J" {9 Y& i
  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>
$ ]# k. u" T- `( S6 b  l<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>) z2 e+ K0 S5 s' |$ J6 Z% i6 L* C
<>例:fclose(fp);</P>
1 \% U0 u" E- T6 {/ f<>3.fputc()
1 T0 D( ~  K& E" s+ I0 S  g  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>
5 `- D/ ^7 I; j  W# D1 Q<>例:fputc('X',fp);</P>
! V% L3 @! c* _<>4.fgetc()& h- [* X7 ?0 t# K
  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>. \, _) m/ J; X
<>例:char ch1=fgetc(fp);</P>
' U, }% R6 M  R" a<>5. fseek()
) }! d/ M- P! l2 e5 G6 n  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>0 C3 v7 r! G) s5 b! j
<>符号常量 值 基准位置
& U7 e0 _/ `9 ESEEK_SET 0 文件开头
: n9 o4 n8 o+ E. JSEEK_CUR 1 当前读写的位置 # y$ D, w+ }4 y9 o8 P
SEEK_END 2 文件尾部 </P>& D/ K' Y6 a1 k
<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>
+ H1 f& U' h; D. N4 Y& R+ Y<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>
. |/ q9 j% x6 [3 X<>6.fputs()
0 _1 I" s1 u: s) i9 _+ m  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>5 P: a% u8 S/ n
<>例:fputs("I Love You",fp);</P>
# x  O( q* t& A1 q$ x/ G<>7.fgets()
4 L8 R0 h) M& j+ H6 _/ L; [  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>
' B+ G) O* p$ E5 E; i2 [<>例:如果一个文件的当前位置的文本如下</P>1 K9 d2 x: X+ ?7 ]' K
<>Love ,I Have</P>
' Z( q$ H# X$ ~9 L4 I  M' n$ d<P>But ........</P>
2 R0 m9 g8 \# u9 B! F<P>如果用</P>
$ D! v; O! y* q" R' n5 n<P>  fgets(str1,4,file1);</P>
( _/ n7 K2 {" T6 q<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>2 e: @2 S3 S$ H, k
<P>  fgets(str1,23,file1);</P># t+ _; c& v6 Z/ c! e; A. O5 @
<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>1 z0 C, a+ b# V. c: k, d
<P>8.fprintf()6 Q/ w4 h8 Y/ X/ T7 }& g
  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>
" ^) t: S( m! j/ x& M# H<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>
) Y' H( i1 W! V/ ^* t# h, h<P>9.fscanf()7 l# q" Y* \6 T* b) x
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>
2 n3 l2 X  c, ^8 x9 q<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>
1 I: s# k; C6 O<P>10.feof()
4 C" ?" }; C1 K! t) \. O* }  f3 g  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>9 d( P6 u. q. h, z
<P>例:if(feof(fp))printf("已到文件尾");</P>6 i4 I1 m( i) f) N" ]
<P>11.ferror()7 P3 ^& P" j8 E+ D3 q
  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>8 S  @  X# q' C" s9 K
<P>例:printf("%d",ferror(fp));</P>
+ u  M9 E3 S; j& D) Z  i<P>12.rewind()
) u9 b. r1 B7 \6 \  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>
2 a2 W. f4 L0 U" U- P* _9 ?! A<P>例:rewind(fp);</P>
# |3 h; @* ?6 R( K* l8 Z1 t<P>12.remove()
( }- P: T. g3 _5 R( D0 L/ f  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>
) e- _6 k, d; `; |<P>例:remove("c:\\io.sys");</P>
5 ~. T3 M) f7 i' _5 F) I0 L/ ~<P>13.fread()  {4 h9 b/ ~$ H% I  b
  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>, q% {, D. X/ z1 [' W3 }
<P>例:</P>6 C: I+ g0 E( w+ Z# }
<P>  char x[4230];
1 n5 T! _+ [7 ?9 [  FILE *file1=fopen("c:\\msdos.sys","r");
6 q3 Q3 Y% \5 s) X" `  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>; m7 }# d, c4 Z) h
<P>14.fwrite()
& c: B/ a7 ~) a: c  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>; S  s: r0 {9 y4 A# F# h6 s
<P>例:</P>
: o. {; N( Z0 H' g* v<P>  char x[]="I Love You";5 I& d; `' ~" @7 E2 w- n
  fwire(x, 6,12,fp);//写入6*12=72字节</P>
. j3 R! Q2 ^1 K5 Z! X# G) m<P>  将把"I Love"写到流fp中12次,共72字节</P>
: W) w0 C9 d$ W8 t<P>15.tmpfile()0 f1 }9 V, c2 a5 r: f1 @7 T
  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>4 K4 q' e7 m4 R/ m; |  }1 w0 G
<P>例:FILE *fp=tmpfile();</P>0 ^- }5 U& ?3 Z7 @" s' a& q2 a
<P>16.tmpnam();0 m$ T4 i4 v/ B+ N. {
  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>  o% S% z" k" z1 [, Z

2 M1 [0 J3 d2 n, i* o$ G5 a<P>
0 B9 k& v: l2 R8 c/ ~$ b: t  o </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-9-1 11:22 , Processed in 0.281592 second(s), 51 queries .

回顶部