QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作
5 u3 Q- o2 e5 Q  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>
/ `3 a8 n5 J- m8 x0 {/ o4 w) Q<>一、流式文件操作' }4 F! k" D. V( D$ g0 g- L! l- h6 g
  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>; B0 x) g0 S5 x
<>typedef struct {
/ B4 J+ X3 ?- `% I! ]! Sint level; /* fill/empty level of buffer */
& }- R& g, K$ ]* gunsigned flags; /* File status flags */
" f: E( w# ^3 L, c; Achar fd; /* File descriptor */' o4 |/ w# g0 h, Z  C6 t
unsigned char hold; /* Ungetc char if no buffer */' ?( q; B$ c5 P5 I; r
int bsize; /* Buffer size */
0 G8 n! v1 m" a) a8 O2 `! iunsigned char _FAR *buffer; /* Data transfer buffer */
  y% |; z% K8 j& R. ]6 wunsigned char _FAR *curp; /* Current active pointer */8 v  l7 Q. n* P0 |, P- s
unsigned istemp; /* Temporary file indicator */
  [9 e* z: B9 }' [2 f4 {8 Mshort token; /* Used for validity checking */
( m$ e4 r/ {( D- u1 ^; r} FILE; /* This is the FILE object */</P>/ m4 l" Q0 `0 e, k' `. i: D  Y
<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能
3 b* N* w6 D' sfopen() 打开流 . q5 o+ f9 H' V
fclose() 关闭流 ) D5 [. E( T; E' ^
fputc() 写一个字符到流中
, l) R$ G3 ]. @8 ~2 o: mfgetc() 从流中读一个字符
. G- {- ]; c6 i1 [1 f8 B' \8 ^6 Kfseek() 在流中定位到指定的字符
6 `1 v$ R9 O/ R0 Ifputs() 写字符串到流 - e6 X& y. C: q; e* Q
fgets() 从流中读一行或指定个字符 / F7 H* ~$ Y2 ^3 t* ?
fprintf() 按格式输出到流
: ?* v$ [1 M7 xfscanf() 从流中按格式读取 3 X/ ~* B0 H/ Z1 l0 V! Q! s/ {" v7 n
feof() 到达文件尾时返回真值
' R% ~9 D3 A- }" uferror() 发生错误时返回其值
5 m4 ?7 l1 q) qrewind() 复位文件定位器到文件开始处
- |6 \( n2 D' p7 kremove() 删除文件
5 Q0 ~8 A. |6 t+ o6 zfread() 从流中读指定个数的字符 0 b4 j1 q5 ^1 o0 J
fwrite() 向流中写指定个数的字符 . I7 H- y9 B; J! f, Q+ m2 q- H
tmpfile() 生成一个临时文件流 ! q/ j2 p, }3 W" u0 c+ k0 S
tmpnam() 生成一个唯一的文件名 </P>' H1 S2 J6 y+ a( f. h
<>
0 o2 B5 ~6 O. u( ^  下面就介绍一下这些函数</P>0 B5 I6 }7 H; t" k9 @/ }% U
<>1.fopen()
8 Y6 J0 c  Q  L: M4 u  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>$ \4 F7 c$ o# E3 r* i
<>为使用而打开一个流
+ ~# i9 {; K- `( L: K; c; P4 s把一个文件和此流相连接 $ X5 ^/ [* Q" j* T: n
给此流返回一个FILR指针
6 `! z+ ~5 Z6 r! f0 W) U参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>
* S" h; ~9 t$ a( E7 G" r( H<>字符串 含义
. g5 p: k$ F, [( P' v5 K"r" 以只读方式打开文件
1 N6 c9 P0 B, B& P"w" 以只写方式打开文件
4 j2 O; {2 l" F9 E2 D5 j  ?"a" 以追加方式打开文件 $ H+ ?' }  Y3 N( I( M
"r+" 以读/写方式打开文件,如无文件出错 4 `+ @; W1 g$ P6 ?1 M1 w
"w+" 以读/写方式打开文件,如无文件生成新文件 </P>5 B& N+ @/ \: x% j: l
<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>
3 Z2 `5 q' Q. c<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P># g; l* B; }5 I
<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>
0 j# v) T% t- j( I$ g<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>
0 e% L* X0 r- Q" n; g<>例:</P>
' J$ k: c8 k1 Y' x6 I  n; w6 o1 s( b<>  FILE *fp; 8 ^+ W' Z. X2 ]
  if(fp=fopen("123.456","wb"))
: y4 ^6 J$ O8 j+ Q, R! e- A; L: J' P    puts("打开文件成功");
( l- Q/ k9 `% Y# C$ Z- v' U  else 6 d, F9 L; u& K, }, I* U( Q- p8 v$ Y
    puts("打开文件成败"); </P>: z* _- e4 N* G. M! t9 ~6 _
<>2.fclose()
" R- Z, l+ w; G# V3 c9 E2 ]  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>
6 b8 E$ X4 W( M1 ?6 D' m<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>  m- B8 D. l9 n  @
<>例:fclose(fp);</P>
2 n5 y2 v# G! X' b1 U- x) b<>3.fputc()  P' ?/ u  u- R5 }) ?
  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>
' C9 p4 \( T& T<>例:fputc('X',fp);</P>
7 c% N4 `. B, o7 \& t<>4.fgetc()
8 f! z1 o: Q1 x. R% c  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>
9 }4 P6 U+ U7 O  T/ P<>例:char ch1=fgetc(fp);</P>
: L. }7 n, F, n; G5 q, I) t4 c2 Q<>5. fseek(). i. ?# u6 A2 _  S' ~+ m3 g
  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>
2 G: X8 h" d2 `. l<>符号常量 值 基准位置
3 V0 G/ a1 h1 {SEEK_SET 0 文件开头
! Y( @" Q% L2 `$ rSEEK_CUR 1 当前读写的位置 3 [* v7 F: I% ^8 ~; E
SEEK_END 2 文件尾部 </P>
' m6 \1 S0 H; |$ K" k3 l<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>
2 ]0 l! ]# V2 v<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>
$ h( ~7 i# a  M5 b# Z4 R<>6.fputs()
8 O6 `' _( y7 H  r7 J7 v  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>
5 M1 w& E) {1 q2 Q. N) V& J2 f* p<>例:fputs("I Love You",fp);</P># w3 z3 {/ n2 i& ~3 @6 `
<>7.fgets()
/ U( i$ h+ N2 S) b, [; O: ~+ M& v  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>5 k; n' W3 q1 q; Z
<>例:如果一个文件的当前位置的文本如下</P>% R4 H4 v# d) j( {. u8 _
<>Love ,I Have</P>  v& O/ c2 f' ~$ e. |' r
<P>But ........</P>& r7 \# H2 P: w2 }1 }+ j$ w
<P>如果用</P>
/ j( G; m4 s' i! L! z# V<P>  fgets(str1,4,file1);</P>
6 K% e; O7 S0 C) D<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>* u! @' S; u' _7 g; _- L
<P>  fgets(str1,23,file1);</P>4 W* V; d8 p5 d8 J. ^
<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>
; z5 ?: c! I5 c$ m<P>8.fprintf()
" }/ Y' F+ k. J2 f2 g  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>9 e+ o2 p2 I# l0 X$ u5 P
<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>
2 ~$ ~( d0 \$ W( g3 h<P>9.fscanf(): b5 {9 Z: c1 W8 Z5 m4 s
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>
/ R8 r3 `2 d* M$ s6 V<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>0 n; ?" d) P2 Z% V( n% h, B
<P>10.feof()
6 g+ s. b5 o* B7 z, v  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>
! {8 L0 I& I+ l0 K9 h; b<P>例:if(feof(fp))printf("已到文件尾");</P>+ s, k6 n2 ^8 ?) D) Z
<P>11.ferror()
" x& U9 v4 r. O  Q  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>7 U2 @) q1 T1 O5 w7 \- L
<P>例:printf("%d",ferror(fp));</P>6 O  ?* V  t$ q
<P>12.rewind()
( N% z0 i7 M* o8 n  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>
- T- e, d4 g" x2 t" I7 I1 h<P>例:rewind(fp);</P>8 f4 n" _- I$ x9 j
<P>12.remove()1 ?0 p( e  f  `# _' M0 v( R& b
  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>
& g5 ~( @, ?$ x, O! w8 K8 }<P>例:remove("c:\\io.sys");</P>
* P, W2 {1 j7 @/ K  A<P>13.fread()
) ]; ], \) V$ w2 H! m! q4 Q8 c8 d  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>9 t& ~% _- F' s& [5 p
<P>例:</P>
( E& p+ Z8 O( _<P>  char x[4230];/ ~, E% O* Z% S5 I& y  d
  FILE *file1=fopen("c:\\msdos.sys","r");2 d1 @) f! D% G+ u; n* i- f
  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>
  T; S& T7 E- b, D<P>14.fwrite()
$ D. E' P7 F+ j  p7 Q- j  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
. N7 |' J3 N' U# P& W  U<P>例:</P>
' V0 L/ O+ f% r* _) i, P# L, M0 ?<P>  char x[]="I Love You";
$ r' W$ h2 X- I  A/ L  fwire(x, 6,12,fp);//写入6*12=72字节</P>
6 \- Y/ A+ w' g; C<P>  将把"I Love"写到流fp中12次,共72字节</P>
) P% ~) S4 K# E: {* F" D<P>15.tmpfile()9 j$ U6 u* H8 ]' R9 P- d  W
  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>2 X0 o- ~8 }( {/ _3 U1 b
<P>例:FILE *fp=tmpfile();</P>
% N7 o$ c8 i8 @8 z<P>16.tmpnam();
0 q: ^) ]$ e; C, G  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>; f( E5 ^8 [  o  y8 u8 e% A
5 R, P/ H/ N1 X
<P>) y* X1 k" {4 G1 z" w- g
</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-9-23 13:40 , Processed in 1.918307 second(s), 52 queries .

回顶部