QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作 + \6 @  k2 h5 L
  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>
: q# |# E4 A! e7 }2 x; l<>一、流式文件操作
$ D+ m) v1 K4 T7 b; m  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>( l9 K( @. @/ H/ x
<>typedef struct {  Y' g5 B0 p# y! Y" R( ~9 v; W
int level; /* fill/empty level of buffer */$ N% \" D  K  w, }( G  q8 T4 j' O
unsigned flags; /* File status flags */
; j, r3 }7 ?: t, N8 ~char fd; /* File descriptor */( D$ H) u8 E" T8 ?$ B) p0 f
unsigned char hold; /* Ungetc char if no buffer */
9 }/ V& `4 d' n/ {3 lint bsize; /* Buffer size */' i/ T2 ^1 c9 B
unsigned char _FAR *buffer; /* Data transfer buffer */- {! W! y' \. k9 [4 g
unsigned char _FAR *curp; /* Current active pointer */
/ W: f+ f) @3 kunsigned istemp; /* Temporary file indicator */
0 U$ x4 z/ [. W7 f, ~short token; /* Used for validity checking */
+ A; S; M0 m% H} FILE; /* This is the FILE object */</P>' a2 a+ J8 i0 ^
<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能
& a7 t4 }5 w! U( c! l9 l& lfopen() 打开流
( G7 X% O* |5 p4 G- p7 jfclose() 关闭流
& W  R' ?2 z3 q+ R' ~fputc() 写一个字符到流中
: T% }* }; M$ U0 sfgetc() 从流中读一个字符
/ s/ Y3 F  t4 W: g8 O. _+ s7 dfseek() 在流中定位到指定的字符 7 z" i2 b5 L7 E. C6 S
fputs() 写字符串到流 1 w. W( ?5 b" Q7 [2 k& b$ ?' }/ F: ?$ e
fgets() 从流中读一行或指定个字符
9 p3 M) ?1 m% ifprintf() 按格式输出到流
! f% D$ e) m9 H- n- }fscanf() 从流中按格式读取
- e" j: _/ y! G6 y6 T; R' @feof() 到达文件尾时返回真值
$ [. J- E% m3 H' k, Oferror() 发生错误时返回其值 5 l! b3 K4 ^9 {- b( L5 I) b! ?0 M1 Q
rewind() 复位文件定位器到文件开始处 ! A: }4 F, d& i% d  d% _- V
remove() 删除文件 6 y% s8 ]( N- V( q+ Y, z- R! U
fread() 从流中读指定个数的字符 1 J" y1 {1 z  k, C
fwrite() 向流中写指定个数的字符 , s1 W' l+ P. p/ t  }  X( B
tmpfile() 生成一个临时文件流 : Q6 ?0 t6 S. }+ A5 `8 d2 Z
tmpnam() 生成一个唯一的文件名 </P>$ r% n0 C5 @7 b! j" r. p1 `
<>& E! ~3 B* |7 R
  下面就介绍一下这些函数</P>
3 i; B$ ^. l# y. P* F1 ?3 [& P( B<>1.fopen()" g  n% U7 |* v6 Y5 h& O
  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>7 R' N: g  B* k+ Y: w: _0 t6 @
<>为使用而打开一个流
" B$ ?1 L" l( L7 x) U9 ^0 e  M$ @把一个文件和此流相连接 " G  t: E7 k7 _/ p, Z4 R) ?, U9 {6 D
给此流返回一个FILR指针3 S/ v1 V- K# D5 Q8 Z* y  W/ d
参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>9 {9 }$ n0 [' k8 T$ R. I. F
<>字符串 含义
, I) s* n: S% P+ _"r" 以只读方式打开文件
0 Q$ j# ~, }, {) t& Y/ L"w" 以只写方式打开文件 5 |( [% l7 S, o5 r( Q( l9 C
"a" 以追加方式打开文件
+ h( h, [3 e0 b2 q& \; |"r+" 以读/写方式打开文件,如无文件出错 0 e. D' O5 T1 e$ O+ k6 s$ b1 u8 z
"w+" 以读/写方式打开文件,如无文件生成新文件 </P>
3 u( r5 r1 R8 P* T5 Q! L, \<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>4 v$ p- O0 z9 T& d7 S+ p" m! O
<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>7 d) _7 o  ^7 _. ^; A; j
<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>
3 e5 T& I4 u5 H0 c; }0 A  z<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>6 ?7 N) c3 F; x7 C% W2 J
<>例:</P>! d' A, ]8 I# C1 [+ ?
<>  FILE *fp; * Y: q4 w- e1 u
  if(fp=fopen("123.456","wb"))
5 o9 r, z/ v: G' {- Q    puts("打开文件成功");
3 Q7 F1 ~4 J& z  else ( d2 X! o* _% P- w* {
    puts("打开文件成败"); </P>
; }  W2 t# p/ e* {: l: [$ c' K: k<>2.fclose()
; g! D$ u2 k  n( w  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>
$ B# C% M/ B4 w# V6 q: `9 H8 `  P<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>5 W# E/ R0 V7 b
<>例:fclose(fp);</P>
9 I! s' _* r) G( g) b* U* g1 W<>3.fputc()
0 o$ z3 U0 X4 B# c+ |0 A, K% e  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P># d' D/ {5 Q! J( _" S0 }8 i$ Z
<>例:fputc('X',fp);</P>8 g9 I/ A6 N: {' a' R
<>4.fgetc()
( s( ~3 ^- T) d) d# c1 a  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>
) w: {0 n7 c! o% V3 h0 r<>例:char ch1=fgetc(fp);</P>
# ?2 o/ A4 @7 w<>5. fseek()
) Z) F, i; C  j  ~- L  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>
  D$ c+ `. t8 _2 I<>符号常量 值 基准位置
* f9 K  T* R1 g0 E6 |( y, ASEEK_SET 0 文件开头
& g  ]3 O4 ~3 H  M' k* B- f- hSEEK_CUR 1 当前读写的位置 - R2 ]! I2 }/ t7 k
SEEK_END 2 文件尾部 </P>
2 ]3 `7 g' s" q2 ~% _<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>
3 y/ K9 s. d  G; F<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>9 p% m' d6 P! `& ~# l
<>6.fputs()
4 f7 N, O! @. N1 c: v  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>
6 R3 t5 R/ ?' N! ]' q<>例:fputs("I Love You",fp);</P>, K" [: a  z  D1 H8 _/ C. s1 {
<>7.fgets()
9 Y) x# a/ f4 \  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>/ f* y" u& ^9 q  b
<>例:如果一个文件的当前位置的文本如下</P>: n8 I% c! L7 g/ Y6 O# u
<>Love ,I Have</P>3 M" M0 M9 e8 }' o1 j( G8 m
<P>But ........</P>
4 a" e! N0 f8 ^! H5 p9 l# O<P>如果用</P>0 f- f4 b  O9 O9 F$ u
<P>  fgets(str1,4,file1);</P>
7 w) T/ i- y# u. G! {<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>
- ^8 Z  l4 w' @: g) H! b<P>  fgets(str1,23,file1);</P>
* Y/ e2 y. q5 Y: {<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>
/ @2 D9 [. z4 `6 M<P>8.fprintf()( M) X. h( _3 F- W% e  c3 A) V
  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>- D% a2 ~3 C) z( K7 [6 R+ c: F
<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>
/ C* F5 s/ f' ~" t<P>9.fscanf()
. Z2 M! n9 c% O. p  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>
( E2 Q, S4 U" [7 K9 x9 |3 A  a<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>3 B, j4 G( z% O* V4 M
<P>10.feof()+ v2 `) p' {% H5 x; m) @
  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>- _+ `8 _) N0 j$ I
<P>例:if(feof(fp))printf("已到文件尾");</P>. y$ ~' G3 h8 m( e; N. P
<P>11.ferror()
. t/ f2 ?. U/ D3 D  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>
: [; S3 I0 L  Y<P>例:printf("%d",ferror(fp));</P>
: i( s+ v- W, m8 M: v. k" ~, ~$ |<P>12.rewind()
7 D6 U7 v! v$ r' ^3 t0 h3 y2 k  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>
/ Q7 C1 ]  p& L1 G<P>例:rewind(fp);</P>
6 A) e( C, }! I3 R8 L2 x<P>12.remove()" o& a/ J# j( z9 p
  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>' Y2 Z& O1 U8 Q* D
<P>例:remove("c:\\io.sys");</P>
( w  I+ g5 h$ l9 h7 y<P>13.fread()* ]7 I9 y% x4 R+ t8 ~8 N% Q
  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>; Q4 [# u# F$ W
<P>例:</P>- g  N% A0 @0 a  m2 O9 h
<P>  char x[4230];
! M5 M- I; D% k, X4 D/ G  FILE *file1=fopen("c:\\msdos.sys","r");
4 x* x# h" W  H8 U) L  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>
  P0 L0 [% C/ j& t: `% t, b: Q! B2 d! U! c<P>14.fwrite(): ^6 n: O; G" i! F2 g5 g( }7 z- I
  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
1 r4 Y2 S, W( u<P>例:</P>% s# [" p5 F  c8 `! p
<P>  char x[]="I Love You";8 I& p2 r$ h( e1 e& P) k% A6 z( ?
  fwire(x, 6,12,fp);//写入6*12=72字节</P>
5 [1 e& ]5 J" T: K& {8 C0 f% C& Y<P>  将把"I Love"写到流fp中12次,共72字节</P>7 l! v8 r9 r$ d  K$ b8 L; @
<P>15.tmpfile()2 m  l- d7 K, I: _3 k, ?2 B* o
  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>
6 ]4 c+ |' n5 B7 C% H2 i3 R- _<P>例:FILE *fp=tmpfile();</P>
; }; F. O1 }0 P% P' \<P>16.tmpnam();
! F8 {% ^& e( h. Q" c  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>( B! Y( b0 F( E+ y& L9 d
3 d6 m3 T" V# z- V' b% a
<P>
! s( P; C" B  [+ \* B- { </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, 2025-5-11 23:14 , Processed in 0.429764 second(s), 51 queries .

回顶部