QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作
9 ]" W! a% k" k! |1 r/ t/ Q  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>/ D& x: C0 l( d( |! Z. V8 u& h* Y
<>一、流式文件操作
  k" H( c8 E: ^5 L4 X: I  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>  e5 y8 y) s# o7 p7 `) |. a
<>typedef struct {+ ?; ^! ^- O# L8 ]3 {1 e
int level; /* fill/empty level of buffer */
% V, k9 v5 |+ H4 e0 bunsigned flags; /* File status flags *// Y! L* o# \0 O0 R9 b0 K+ j
char fd; /* File descriptor */
1 ^; Q7 o: V1 dunsigned char hold; /* Ungetc char if no buffer */% F: `! I& b  Z! x$ c3 z
int bsize; /* Buffer size */4 E6 w  q( H3 u
unsigned char _FAR *buffer; /* Data transfer buffer */
3 d; B3 s3 p+ T7 m; b0 X5 O3 Vunsigned char _FAR *curp; /* Current active pointer */" j# M) ]$ O' D' M& P0 i
unsigned istemp; /* Temporary file indicator */- {5 x" z2 i5 K. a% p: t* l  m, e3 m% B
short token; /* Used for validity checking */: w/ A5 W0 w' y" O
} FILE; /* This is the FILE object */</P>
8 C* ^8 `, B$ _* Q<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能 : p/ `/ C9 c) h$ b8 `2 a
fopen() 打开流
6 t! L: x3 |, j3 J, sfclose() 关闭流
) a: x7 y; r# q6 U& j: z  u0 B' Xfputc() 写一个字符到流中 " z  L$ r$ ?# {  v/ p6 m0 G7 `
fgetc() 从流中读一个字符 ( ^5 G5 w  x2 }( j" t; l
fseek() 在流中定位到指定的字符
* C9 h! e: d* q& l5 Ufputs() 写字符串到流
7 T; h" M' ]0 Sfgets() 从流中读一行或指定个字符
" e& u# d/ z9 i7 N" H& ~# Gfprintf() 按格式输出到流 6 Q8 W4 p0 }6 q
fscanf() 从流中按格式读取 1 S. h8 C9 S  N* ]9 ^0 n' v: d
feof() 到达文件尾时返回真值
: O% L+ y6 }1 Qferror() 发生错误时返回其值 ' s+ U7 f! r3 z1 S) U" a
rewind() 复位文件定位器到文件开始处 1 Y) B7 Q: A! y* a
remove() 删除文件
: u) Z9 n6 i) @6 V7 V/ rfread() 从流中读指定个数的字符 - c4 N2 m7 j: l, u+ n# d. U9 b
fwrite() 向流中写指定个数的字符
" _. w: I: ?* U4 H/ p* v) Btmpfile() 生成一个临时文件流
! }( U/ v+ v6 J0 _0 @tmpnam() 生成一个唯一的文件名 </P>3 W- k5 o( t2 A7 X
<>! g8 u7 `& l' }' |
  下面就介绍一下这些函数</P>% k9 ~) I/ _8 O7 l' `5 J
<>1.fopen()9 ]; `4 V! Z$ c: k4 ~
  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>* k* k! S  V' U, }2 l+ Y) `; _. N# h
<>为使用而打开一个流 7 {& d- s+ Z4 K3 o" n) U( B  V  A
把一个文件和此流相连接 ! L# o- V' G. c9 h
给此流返回一个FILR指针- T  D; N  S- y+ b' L
参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>* g9 Q8 z7 k* }+ g/ P% ]. m, j
<>字符串 含义 9 U. l4 U& Z4 e
"r" 以只读方式打开文件
& J8 K7 }4 T0 H"w" 以只写方式打开文件
# R# t9 |8 e6 m  I# @1 L"a" 以追加方式打开文件
4 `4 V$ S4 A$ s8 `+ K. b; _"r+" 以读/写方式打开文件,如无文件出错 , l. W" n. j, }( ?' f
"w+" 以读/写方式打开文件,如无文件生成新文件 </P>
3 C& q. f. D0 t' D+ F) v+ `<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>
/ ]1 G* O3 E' G- c1 H( g  ?<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>0 f0 Q! P7 e; p  s$ B& q
<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>
+ [, s/ C; o4 n# o! ]<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>
, k+ H: N5 y3 |<>例:</P>
  U1 A7 f$ F7 s<>  FILE *fp;
% B7 S- a8 I5 _0 v! m% c2 G( T$ w  if(fp=fopen("123.456","wb"))0 d( x: W  E. K' o! Q3 W6 Z1 \' ]
    puts("打开文件成功");1 G, k+ d2 k4 ~0 }/ I
  else
& D$ c4 e6 ]2 @    puts("打开文件成败"); </P>
7 v- v3 I3 p9 ^* Q4 C, O, t<>2.fclose() $ O' {$ _5 b4 f8 v
  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>* S+ T+ A+ |4 D
<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>
. B2 p+ r* c" q9 E- n% d3 Y# F<>例:fclose(fp);</P>
! J. F. Z% s4 s& g7 ?  g  J<>3.fputc()
, n: s; u2 H, t4 e  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>/ O! j( B0 j* m
<>例:fputc('X',fp);</P>
1 R2 @8 V4 L+ E  v<>4.fgetc()
! a2 U! r  b$ V- X  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>
' L4 r+ e1 F2 r/ l4 F7 O4 d' ^" C<>例:char ch1=fgetc(fp);</P>
/ ?" A/ g' i2 d<>5. fseek()# D, P( s0 L/ O5 g$ \7 v; Z* _
  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>/ ]- @3 M, ]( p; |
<>符号常量 值 基准位置
1 S/ N* Z3 T) C" mSEEK_SET 0 文件开头
) h% }; q, j; ^6 i7 _SEEK_CUR 1 当前读写的位置
1 Z; y# {+ V  B0 V- p: _! q' BSEEK_END 2 文件尾部 </P>. i0 ]# X' I9 r8 h( ~2 ~
<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>/ Q$ P2 B" m' B+ O4 V' |( @. d
<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>  h& R9 _; }4 T1 h
<>6.fputs()
5 L% s) N4 R, F$ J  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>9 u! _6 Y+ P7 N; v; Y6 x
<>例:fputs("I Love You",fp);</P>
; S3 v' M/ N( A4 m<>7.fgets()
8 U/ K* S* k: z4 E  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>
1 G8 g9 \, Z: W/ B2 l  e' p  t<>例:如果一个文件的当前位置的文本如下</P>' ^3 z( S2 E/ a7 ]
<>Love ,I Have</P>
$ ^9 m" O* E) J/ {<P>But ........</P>
; ]4 G+ K% g; Y) D7 ]<P>如果用</P>
- x, c' w" c7 g4 B4 G<P>  fgets(str1,4,file1);</P>
- }; ]/ C$ f/ G<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>
) P" n  p# m( b- L<P>  fgets(str1,23,file1);</P>$ s' L! u: R8 a7 S: Q/ y, T/ I
<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>
( B$ {- k$ d) {  z; b2 _<P>8.fprintf()
% |5 \7 P4 h; C  X) L( C5 h  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>1 g1 I" _7 k. i3 I1 C/ {
<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>
2 D8 C; c+ J; p+ X<P>9.fscanf()" ^8 B. ]& y) V2 w6 t9 q/ y
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>
8 [# A* I/ ~) _<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>: A& l" C" s0 m9 L
<P>10.feof()
+ n0 f8 V+ p- Q  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>; O( [$ h* g! C1 s1 S) n. k
<P>例:if(feof(fp))printf("已到文件尾");</P>& r+ T1 m" W1 O1 R. p% X% L
<P>11.ferror()
) j/ l2 l* V6 |! R  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>
& v6 u7 l! {- I% p0 e<P>例:printf("%d",ferror(fp));</P># f5 D" u5 g5 E( q, e
<P>12.rewind()
! O% Q3 r2 v9 E! H1 o2 r  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>$ ]" f8 [' J0 }' o: z9 {) ?+ m
<P>例:rewind(fp);</P>& |/ Z, D, @6 V; W
<P>12.remove()
+ X+ q5 V$ i  N% t  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>
/ X" `' q& ?3 ~$ Y2 c<P>例:remove("c:\\io.sys");</P>
6 U: Y- X" ?+ \0 Z& x# c6 W, w<P>13.fread()
) K! _; i1 ~8 k0 L0 [# d/ a  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>& t7 b" k& D5 O+ k. _% v  W
<P>例:</P>
' L) f# E+ t; O! e<P>  char x[4230];. x0 u# l. o- K. g1 f' r$ A) j
  FILE *file1=fopen("c:\\msdos.sys","r");
# F# V' q" a$ E& R4 r" F- G  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>
) O- d! Z; k1 F# B<P>14.fwrite()
+ l. p/ A( k- R/ n+ M% m7 y  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>, ]. K% n0 v6 }4 ~* U
<P>例:</P>* c& ~) a6 ~! Y: D: Q
<P>  char x[]="I Love You";& Q: X/ T9 ^5 _4 e5 N3 d, t2 n: `
  fwire(x, 6,12,fp);//写入6*12=72字节</P>8 V7 n1 z+ [8 D; J5 S0 m
<P>  将把"I Love"写到流fp中12次,共72字节</P>
0 g" a2 a1 e. s+ I) f<P>15.tmpfile()
! p( s% G; u/ F2 z( p  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>% j/ M1 w5 Y6 k+ A$ m4 t: c
<P>例:FILE *fp=tmpfile();</P>6 f) n1 [" s2 P  a* e) A0 \
<P>16.tmpnam();
$ _$ j/ r( ~+ a& v# M  P$ L  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>
: u+ m% g! e6 n! _% S3 K+ X% @1 Z* L+ U: A% Z2 L
<P>. ^8 b+ B  n, a* t0 Z3 Y* L- V% {
</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-20 16:07 , Processed in 0.950237 second(s), 52 queries .

回顶部