QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作
$ W4 W1 E$ y2 C4 Q' W$ M8 N$ d  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>
/ i, E* Y. S- F6 ]<>一、流式文件操作& ]" J% A" @* i* R
  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>
- }3 \/ S8 h$ O+ n<>typedef struct {
% z* u, p& f2 p6 Dint level; /* fill/empty level of buffer */
  ~) f2 h7 ^; L9 Z4 F: J# Dunsigned flags; /* File status flags */
( r6 @4 z8 K$ C' c0 a* W) F6 xchar fd; /* File descriptor */
8 ?3 M$ y6 o) z$ L& Y# x- junsigned char hold; /* Ungetc char if no buffer */
. Y  G) }; E) i5 aint bsize; /* Buffer size */% t- a4 S$ C7 _8 Y
unsigned char _FAR *buffer; /* Data transfer buffer */4 B, I* _+ Y$ k: h. a* M. Q3 Z  ]
unsigned char _FAR *curp; /* Current active pointer */* a* d8 q6 J7 s% x. d* n/ ]; X
unsigned istemp; /* Temporary file indicator */& A0 |; _& @% o9 g; n0 u% O# ?  `
short token; /* Used for validity checking */! Z7 p0 I5 {/ L' b8 [
} FILE; /* This is the FILE object */</P>% v( Y: g# s. k, d* h
<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能 / s0 c& i4 r. `% L) W/ K- d
fopen() 打开流 ; C! U- R7 X! |, i' n" W
fclose() 关闭流 ; x' y$ q* L0 @. x# X$ t/ x
fputc() 写一个字符到流中
+ u/ T" Z: B" P- dfgetc() 从流中读一个字符
9 k  O- |: o4 L1 z% t7 P( Lfseek() 在流中定位到指定的字符 . z3 k* J8 b4 N4 S+ D
fputs() 写字符串到流 6 W+ f" ~$ T$ c5 Y
fgets() 从流中读一行或指定个字符
6 D$ R; s( L$ kfprintf() 按格式输出到流
- C  L1 Q+ _9 }' U0 \6 e% {4 rfscanf() 从流中按格式读取 4 H2 u+ i2 u/ S. V0 v
feof() 到达文件尾时返回真值 7 e  g. V$ T# [# N2 r3 V, C
ferror() 发生错误时返回其值 ( m" u; w+ |6 m3 N. f  w
rewind() 复位文件定位器到文件开始处 " }1 B+ v/ ^  f( R5 z% X2 j# H
remove() 删除文件 / x+ ]3 ~; p7 _% K/ U( B
fread() 从流中读指定个数的字符 % E7 A* g; R! g7 K' E
fwrite() 向流中写指定个数的字符   ]6 b# g+ _/ i& \
tmpfile() 生成一个临时文件流
6 I( r) x& N) x' V0 |- r/ Ltmpnam() 生成一个唯一的文件名 </P>
- D  t! f  {# \$ S<>; R+ D6 @6 W" B
  下面就介绍一下这些函数</P>
6 n- ?! I( @$ c' k0 ^  I% H<>1.fopen()
- f4 t! y! e) x% b% z0 L  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>1 O4 I& F- [* h8 s
<>为使用而打开一个流
$ F& Z2 q3 Y: _5 f7 _0 y把一个文件和此流相连接
4 n7 D$ K* p' S( w7 [* o给此流返回一个FILR指针+ p$ J4 }3 Y: V* s" v$ M3 i
参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>- a- v; ]  L! j' R4 K1 t, s! C" J
<>字符串 含义 ! c5 B+ A9 G6 A2 F
"r" 以只读方式打开文件 3 r9 Z. k% j1 i) U7 `
"w" 以只写方式打开文件 1 f+ m& d/ V1 b9 G1 X) T: _0 v8 M" K
"a" 以追加方式打开文件 ) o; K; n& Z; s. a! f# [
"r+" 以读/写方式打开文件,如无文件出错
( S! h0 Q; T: P$ Q$ n8 V5 M"w+" 以读/写方式打开文件,如无文件生成新文件 </P>
4 A+ d) W6 t2 B5 s- E+ t4 l7 M<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>
) n% A  ~6 b  }' J' O. `<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>; {/ w8 f( m% W+ w( B/ x
<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>! g8 G* \: [5 O
<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>
1 m! _8 h) h' X' i<>例:</P>
: A1 l/ \+ t) C* p5 a- {<>  FILE *fp; % }: o6 M2 b: \
  if(fp=fopen("123.456","wb"))
+ J2 J. k, Z. c* G! N0 I    puts("打开文件成功");4 X) v" o: I  G& r
  else / x( W4 @% h7 \6 k6 o; T
    puts("打开文件成败"); </P>
2 n* z2 K+ n& C# ?) b. a8 P* k. s3 W<>2.fclose() 0 n3 y$ T1 n  M" C  Y9 g4 g) C+ q
  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>
2 q+ B% z1 e6 K1 ]4 J<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>
; g% T# I5 ]0 E# r: p( {, J6 I3 ?<>例:fclose(fp);</P>" |" i5 n1 Z2 D8 }- S) j& ]
<>3.fputc()* j/ F, r& o9 q. L6 a- h/ J4 l
  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>
# a' R5 h+ P, C6 i# a) i% i<>例:fputc('X',fp);</P>
/ K4 F3 P% Z& D<>4.fgetc()- H% a$ `& m3 G
  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>0 @8 ]& P! V& }% F: ]5 H5 S* d
<>例:char ch1=fgetc(fp);</P>
9 r4 \2 N) i' _3 L4 Z* C) M9 r<>5. fseek()- z* Q. g) X" r& m
  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>) c% [7 d+ e9 B
<>符号常量 值 基准位置 ! s/ V! L: H" ^
SEEK_SET 0 文件开头
5 h( D' m4 z# ]& g- F& T; DSEEK_CUR 1 当前读写的位置
  `, Y/ E6 x. i0 W+ i7 g" R2 LSEEK_END 2 文件尾部 </P>5 x9 a: y" c- E0 ^  ]
<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>
* \+ o. w3 n% G2 Z<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>( k  _  J5 G2 a: C
<>6.fputs()) T) N- w' F, u8 W& Z; j! f% ?
  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>
$ ]. z7 A3 y$ A7 i9 F* M<>例:fputs("I Love You",fp);</P>! ]# v# F5 O3 r3 E& |2 |
<>7.fgets()
* I1 M% u' t+ G! B$ e3 y  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>& v6 C" w. }  e+ U- }" T
<>例:如果一个文件的当前位置的文本如下</P>. m4 \* I: j4 u6 I) y
<>Love ,I Have</P>! ]% F1 j' P$ V) ^# A. R
<P>But ........</P>
5 O' L) y4 V9 Y( Z9 l<P>如果用</P>
" A* P3 q7 H+ Z1 N6 e& L6 {<P>  fgets(str1,4,file1);</P>; f# Y3 f9 V5 b/ }! J* {+ q
<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>
, S0 q- \! Q5 M3 J2 d<P>  fgets(str1,23,file1);</P>
: F0 Q  _0 q+ A8 L& z) v<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>1 J# x$ v" R0 S1 d
<P>8.fprintf()
* B' w1 z8 z* Y/ R, P1 A* M3 F/ [  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>, _/ l- U, c, ^4 g
<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>
5 K' A* \, f, z) `+ m# C7 w<P>9.fscanf()
) i3 V5 \  ]/ h; v% I/ Q  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>5 Z  o& D! s& |( @/ m
<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>
( O- i  O+ V5 [: _) \" F<P>10.feof()
) s3 r6 H1 `. o  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>
) K$ K2 @2 D6 K+ `. o5 r<P>例:if(feof(fp))printf("已到文件尾");</P>
" a, g; S& V6 H) X: ]# ^' o1 w<P>11.ferror()
5 n7 k. a& f) ?2 _- e) Y4 a) Q  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>
0 X" F6 G$ a+ U# V<P>例:printf("%d",ferror(fp));</P>* z3 x5 u( ~4 J; h' i3 @
<P>12.rewind()
( |0 A) L4 W; u  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>- y$ o5 `( E  Z
<P>例:rewind(fp);</P>  D/ F; l% X: T) p' L/ q/ h
<P>12.remove()- z6 H" |$ P# |% L
  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>
+ f6 k3 G" x8 l5 C/ n, t/ ^+ i<P>例:remove("c:\\io.sys");</P>" R  |) ?+ b- b3 b% H/ a" n; X. e5 Y3 ^
<P>13.fread()( p6 p* F" Y" d% I. d9 ~9 t6 w
  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>( F0 S3 f* z& ~9 W! R* L& y
<P>例:</P>( J* [/ `- `9 x8 r5 V
<P>  char x[4230];# z* L7 q. D: q' m
  FILE *file1=fopen("c:\\msdos.sys","r");  f0 F- h# R; q1 |  L0 P' z
  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>6 x: X8 v5 E" l4 ^
<P>14.fwrite()
# P# `* B/ ?8 b$ W; {  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
) O, {0 x" v: @9 v6 |  k, \<P>例:</P>
( |1 j8 k1 `4 ?3 o: L0 F<P>  char x[]="I Love You";4 h. g+ Y* |" k6 \+ g9 m) c) {  Q
  fwire(x, 6,12,fp);//写入6*12=72字节</P>' H  {6 L6 C) j: \
<P>  将把"I Love"写到流fp中12次,共72字节</P>
& Q! n; S! J' n: Y6 u<P>15.tmpfile()
' b) K$ f& S9 n7 W. O8 g* v  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>( m3 ?* e+ G+ V* t) v  E: J1 i2 w
<P>例:FILE *fp=tmpfile();</P>% q- X- e9 E5 g  l2 Q$ W
<P>16.tmpnam();
( g* o1 W9 U6 Z: P+ L  @5 ~  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>( T6 F$ `' \# B7 _: A' n/ r( Y
' Y6 x& [& V4 `/ ^$ t; f1 s8 B/ G/ X
<P>2 K0 R* d# J0 N
</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-8-8 11:02 , Processed in 0.432495 second(s), 52 queries .

回顶部