QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作
% c9 u- ?* ~+ B7 r. {$ H  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>5 A1 {& p" i9 B' N( G6 _
<>一、流式文件操作
1 w  v' L3 a. a5 C7 g, s  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>
3 A. n3 v7 t5 ?: ~, n<>typedef struct {, v$ E" F: C6 e" V$ Z/ a  X
int level; /* fill/empty level of buffer */+ t2 P4 U2 f2 g
unsigned flags; /* File status flags */- M. V$ T4 q5 G
char fd; /* File descriptor */- I$ F! f: e, j+ M- ~2 W- q, q
unsigned char hold; /* Ungetc char if no buffer */
# U/ K7 [7 g! L# ^int bsize; /* Buffer size */$ l$ F' \# N/ g3 Y- j$ Y
unsigned char _FAR *buffer; /* Data transfer buffer */
6 ]# I6 W/ }8 C% F& ]unsigned char _FAR *curp; /* Current active pointer */( j, w6 |, x9 K1 u) w0 |4 s
unsigned istemp; /* Temporary file indicator */6 [2 q5 [/ X1 A5 Q$ {0 G
short token; /* Used for validity checking */
4 w! p% q& ~3 y9 C! c} FILE; /* This is the FILE object */</P>! m/ U* }2 U, ?/ o
<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能 + A9 k$ e7 h, Y) F5 P% k/ R
fopen() 打开流 ! s1 T! `# q) l
fclose() 关闭流 & M' A9 d9 T3 i- m& W$ i' l
fputc() 写一个字符到流中 ) t3 |4 t0 Y! M- x; ?0 o
fgetc() 从流中读一个字符 , h% l8 ]& z, t8 \& F" Q
fseek() 在流中定位到指定的字符
6 F$ k: a- Q) ^0 I8 w. `5 E4 Xfputs() 写字符串到流 . i+ s, ^" X( [& _; f6 I  W
fgets() 从流中读一行或指定个字符 / @8 s: e3 \3 }' I
fprintf() 按格式输出到流 ) v2 P$ n" |6 K; W, J! U
fscanf() 从流中按格式读取 6 a6 k' i% m& B
feof() 到达文件尾时返回真值
' f6 J; T2 C/ Vferror() 发生错误时返回其值 ; _( `' o% `4 e3 x1 N' o
rewind() 复位文件定位器到文件开始处
6 o- J: h" p* D& y" Sremove() 删除文件
# z# L: d/ q' g9 ]3 ofread() 从流中读指定个数的字符
% a5 C* g  v2 C- F8 i! ufwrite() 向流中写指定个数的字符
! _; E6 s& I$ D1 Rtmpfile() 生成一个临时文件流
: x7 I0 u2 e: atmpnam() 生成一个唯一的文件名 </P>  j# P% J; S8 s: `/ U
<>. p3 [9 d$ E" Q) d" M
  下面就介绍一下这些函数</P>9 w4 N! S) {: C5 f) }' M" }+ E4 A
<>1.fopen()
2 M; h; W% e% O6 y2 E6 ^! {  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>
% W% x' R) c8 N1 g. d1 s4 c: m6 x$ G<>为使用而打开一个流
6 J! J! `4 x6 l2 U把一个文件和此流相连接 , @2 S$ T& L4 _  M
给此流返回一个FILR指针* V( |8 x0 X% i; E+ _# P+ u
参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>
" Q/ T$ M: D" C. f  a+ k8 _: C$ g' B: q<>字符串 含义
9 e5 y8 P+ B+ w- \' j, Z6 ^"r" 以只读方式打开文件
7 S6 x4 D3 d9 [* |"w" 以只写方式打开文件 9 |' h4 I1 k+ r, A
"a" 以追加方式打开文件 . T8 x+ Y4 K3 ~* C  `* d0 r( ]
"r+" 以读/写方式打开文件,如无文件出错
$ f4 @. x! Z9 z8 w" V' x! R"w+" 以读/写方式打开文件,如无文件生成新文件 </P>
4 m% G1 G; g0 ~+ N# A9 Z# h5 V<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>/ G% t; q0 H* l% G! X' W; S6 L( t
<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>7 y& x# z  |( @: n& i) Q
<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>
; C6 f4 c& e8 W$ J<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>
3 q. v; d$ G/ k7 h3 l2 W5 u/ X<>例:</P>
: T- E0 }; G) ]- r6 p<>  FILE *fp;
/ D4 \2 R! O% }8 E/ q  F  if(fp=fopen("123.456","wb"))% w8 p# @$ r' ?6 \
    puts("打开文件成功");( Y4 L% w$ A8 z2 q6 ]" I3 n
  else
% G) ^9 Y* d* g0 Q    puts("打开文件成败"); </P>
: g3 {: Y& J  v. n2 a7 y0 L) D<>2.fclose()
$ ?2 N+ j* X- ~0 \7 x* w3 O& A/ T1 V  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>; l! |* _% u: F" {! H9 O0 g4 J& l4 A4 {
<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>
! n/ p& W3 P' a( D* ?* x+ |5 o<>例:fclose(fp);</P>
2 d; U& q% o) s; b; k<>3.fputc()% r) E1 c0 R: k5 H. \3 I2 v8 U
  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>
+ n% ?& D3 }1 I3 F4 J<>例:fputc('X',fp);</P>- p1 o! a6 S: M7 a- @* k* {4 ~" X
<>4.fgetc()0 Z' I) x7 j. L7 T2 R8 ^4 Y3 e
  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>' I/ z* W4 E" S& t( i) ]5 X
<>例:char ch1=fgetc(fp);</P>
0 A; {+ p  A% b: R: B<>5. fseek()
4 @8 L$ P9 V' I0 n& _  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>+ C  S5 n) n& u* H# ]
<>符号常量 值 基准位置
& R( C+ r5 E2 t/ ?SEEK_SET 0 文件开头
  n, c8 E$ e5 z$ [1 d8 |4 gSEEK_CUR 1 当前读写的位置
* V% n6 i# {  E" G/ E% W' USEEK_END 2 文件尾部 </P>9 Q+ w- t8 c( m# j6 G% j: ~
<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>
6 h! n( }0 t5 x# Y  N<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>6 H2 H- u1 o& b' |6 n4 y; @
<>6.fputs()- A* r- r* Y; }/ P
  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>
. y  r. B8 y8 v1 j& p. ]9 P) J# ]<>例:fputs("I Love You",fp);</P>2 }* [9 b  ]0 ~3 Y* _7 e8 @
<>7.fgets()
- j& _& w+ j. v! U" ^  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>9 W3 ^9 p6 K8 R
<>例:如果一个文件的当前位置的文本如下</P>
: B+ V! j. P7 ?<>Love ,I Have</P>. [6 e9 Q3 m& O- D* J$ I
<P>But ........</P>7 E2 t5 W2 @$ Y$ F
<P>如果用</P>  e. T$ o$ O7 l& V6 b) D- R$ x, S
<P>  fgets(str1,4,file1);</P>( k- {$ S& _* n1 Y
<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>
1 M( k6 K1 E9 u, w& X<P>  fgets(str1,23,file1);</P>3 w9 N- Z$ X* b1 n1 n9 l  |3 f
<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>/ e) `1 \. Y; [9 t# I0 l' |8 ^
<P>8.fprintf()" Z9 k$ z- _) v
  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>
5 r1 O. w8 q7 ^+ Z2 {8 e<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>0 x9 u2 P. `- d- r# e9 v% V
<P>9.fscanf()7 J; G" m( N8 D* H- }
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>% m' B0 m5 o5 w! _4 u
<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>7 u- q& H3 ^+ h+ ]
<P>10.feof()
+ H, Q0 t, k- ^3 d  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>, g, n1 S( J" O( @1 i/ ^6 ]& K
<P>例:if(feof(fp))printf("已到文件尾");</P>
& f. B9 r8 k& g% j6 q<P>11.ferror()
8 g! _- n- D, M- M* ^2 x, r  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>- C9 ?4 n1 Y" T. ]# s5 O  n8 m
<P>例:printf("%d",ferror(fp));</P>
' r9 [* N0 q, X" V1 Z7 |; ~<P>12.rewind()2 P- A1 }6 ?6 X- k8 D
  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>
: f6 r5 u/ D- p/ I' i7 Y<P>例:rewind(fp);</P>6 Z9 B* j5 `: i! P
<P>12.remove()
6 k5 }( |& ]: c+ D5 B  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>* j. N" q/ C2 p
<P>例:remove("c:\\io.sys");</P>2 w! Q2 T4 Y7 g% |0 c
<P>13.fread()4 P3 \* m7 N+ C" b9 Q* _# [; w
  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
5 E6 p) n4 ~: @<P>例:</P>0 q/ H, q1 ^. }1 F
<P>  char x[4230];
: ^+ Z3 A- j2 ^' D$ w  FILE *file1=fopen("c:\\msdos.sys","r");
4 C2 }4 [) A% _3 b5 H  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>3 {% K: V' |8 o5 ]
<P>14.fwrite()
4 x7 C8 R, a' v  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
+ A! g- M5 y0 j: z' F  S7 L/ `<P>例:</P>0 i. k* w3 f# R9 x6 }7 w
<P>  char x[]="I Love You";
( ]; ]$ V; Z0 m2 }% W  fwire(x, 6,12,fp);//写入6*12=72字节</P>
4 r, Y* u6 J* m. x0 `" n<P>  将把"I Love"写到流fp中12次,共72字节</P>2 Q1 i. @9 h5 v9 I  E
<P>15.tmpfile()) a6 {$ t. U& y2 G# z5 q
  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>
( f! i" I% k+ w& Q, x; P' C<P>例:FILE *fp=tmpfile();</P>7 i# q9 D, {# I2 o
<P>16.tmpnam();
: W# X9 A3 c8 C2 y  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>
! ~' B7 m1 e: h+ w
: }  g- H+ g6 X<P>; |1 U$ s. w4 |; U4 y
</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-6-11 16:19 , Processed in 0.399958 second(s), 51 queries .

回顶部