QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作
, F  K8 k, Y1 o' @  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>1 u/ w$ o4 f/ a  h1 E0 X
<>一、流式文件操作5 K5 E. f3 G; G* D9 W
  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>' f4 E- \6 o$ L0 P
<>typedef struct {! U3 \. N% k$ L: D
int level; /* fill/empty level of buffer */
2 C: _, y$ c8 `6 h4 |' ^2 j1 Lunsigned flags; /* File status flags */
  U2 O7 X5 |6 v2 ^: d$ Xchar fd; /* File descriptor */; F3 o) U) V2 X6 F3 U+ c
unsigned char hold; /* Ungetc char if no buffer */
1 b9 i8 R6 I# V0 ~  _" Tint bsize; /* Buffer size */: l" U' C) B0 {
unsigned char _FAR *buffer; /* Data transfer buffer */) c1 Z/ l6 ]- A* \9 A
unsigned char _FAR *curp; /* Current active pointer */
; ?; k6 j1 `% g. {) [- I0 W) Qunsigned istemp; /* Temporary file indicator */
7 Y) L8 m1 z! |  t# Nshort token; /* Used for validity checking */
6 L. y: {. H% C+ M5 F4 f} FILE; /* This is the FILE object */</P># }* W" X+ I& c) D: `% B2 p" C
<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能
# f/ b/ @2 Y& c$ l! G. _8 ?, F9 dfopen() 打开流
, y  V  Q. v& I7 Kfclose() 关闭流 4 Z1 h" }) o  @6 b, f5 y
fputc() 写一个字符到流中 : z( ^0 m& b5 \& {$ _
fgetc() 从流中读一个字符 3 I2 V! K4 U; Z) Z4 S: l
fseek() 在流中定位到指定的字符
- M7 P8 j. p; V" I' v6 D2 ?fputs() 写字符串到流 7 _6 }0 X0 d9 g* v( A1 U$ x* a: P
fgets() 从流中读一行或指定个字符 . r& J5 X3 d0 x+ {, ~5 j
fprintf() 按格式输出到流
+ `1 h/ ~) d( j' g+ h8 ?( ofscanf() 从流中按格式读取
+ B: @4 n+ P8 ~$ [9 _, T# Lfeof() 到达文件尾时返回真值 ; ~8 M, q7 I" n
ferror() 发生错误时返回其值 6 N: G* {+ x0 M9 v6 }# l9 ]8 [) L
rewind() 复位文件定位器到文件开始处
% o% s0 r" r0 R3 @remove() 删除文件
7 w* q2 Z3 m) q9 V; n' ~  j. Sfread() 从流中读指定个数的字符
5 O- M5 m0 _$ z  n% T. Qfwrite() 向流中写指定个数的字符
0 U, I! q% j% d* y( k2 m: s, G3 atmpfile() 生成一个临时文件流 . L: t$ ^6 g" X; J3 ^7 b3 j) t' N
tmpnam() 生成一个唯一的文件名 </P>
6 S; B# W) x1 o/ F<>
$ N) |4 e# w8 U  x6 n( n( r$ f  下面就介绍一下这些函数</P>
' j/ Z5 q, ?! {<>1.fopen()  X/ i3 o& t3 c% N4 q1 M
  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>& r6 M3 o" I" g) f
<>为使用而打开一个流 9 I/ b8 T( T5 |3 Q: i! ~; o
把一个文件和此流相连接 2 O& X& N! i3 w- P. {- k% E) a
给此流返回一个FILR指针
7 d6 |9 x3 F/ j- X: H# g" Z' q参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>
5 K% q. @+ Y7 n# R8 x0 G; a4 m<>字符串 含义
8 k7 v8 e- y, V) c) w"r" 以只读方式打开文件 7 a* ]7 W( m/ j1 _4 B
"w" 以只写方式打开文件
" B$ [* M$ {, ]' [& a"a" 以追加方式打开文件
# p; v) @# V8 h3 b# K$ m"r+" 以读/写方式打开文件,如无文件出错
# Q: u. ^3 t6 [- K, q! {"w+" 以读/写方式打开文件,如无文件生成新文件 </P>
0 w0 K+ Z( A1 B9 H; Y<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>
2 N# q7 S2 _6 |1 m0 K8 g<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>
, N5 S3 r8 x1 o- m<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>9 K0 {+ v% W& [/ g0 n$ R
<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>
. L$ k) x6 g" f6 [& i- C2 w0 c<>例:</P>
  x, F1 [% _* j* `# [+ D<>  FILE *fp; 8 T! u9 [. C! F' `' {0 X
  if(fp=fopen("123.456","wb"))
/ |+ a* k4 k/ }* s    puts("打开文件成功");0 D3 v& ?: p4 y3 W2 i& o6 Q
  else
4 X% _5 Y) U4 j    puts("打开文件成败"); </P>
- M5 Z/ {9 S- e, m5 ?( E6 ?<>2.fclose()
. @" L# t+ r4 o5 D  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>, x: d2 H& ^# D& \5 w1 F
<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>
6 w* D. D# R, [2 N: E/ m<>例:fclose(fp);</P>* q6 |+ B6 d' l$ T0 s0 S
<>3.fputc()
( z) o8 L6 j7 d: F! T1 r  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>" Y4 H; o, F# j& `  L, V" c
<>例:fputc('X',fp);</P>
, ]1 R5 V. V( ]) e! e2 O2 {<>4.fgetc()
8 `) q4 {9 b) s  a6 V( X  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>
# K- w* m, L/ F, r9 o) @9 ^7 v7 M<>例:char ch1=fgetc(fp);</P>" S- B$ X' S) |& q1 X
<>5. fseek()
, K& c* G& \' @) w  V0 R  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>5 C. a! h9 g/ N
<>符号常量 值 基准位置 % y5 ?, |9 z4 [" g6 ]5 j3 S
SEEK_SET 0 文件开头   I, f, a( v# K& i  J
SEEK_CUR 1 当前读写的位置 4 R' F% w& Q# s" F2 g
SEEK_END 2 文件尾部 </P>5 V& h3 s; m3 O7 n2 b0 P: T* t
<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>
9 [1 r0 O0 E2 k; s+ B6 ]9 {<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>
; ]: M4 \  r, Z( O) u<>6.fputs()
3 H* {6 s1 X& B: {5 J% o  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>1 {, G  o0 E2 Q. J  A8 T( d8 g
<>例:fputs("I Love You",fp);</P>
8 D9 W& _, A+ Q. V<>7.fgets()3 i% e/ y' t9 S5 _1 ?+ \
  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>
9 H  \; r& x; t" l; c, S<>例:如果一个文件的当前位置的文本如下</P>
. j6 N. D3 Z0 j; d" t% H1 W3 h+ [; ?<>Love ,I Have</P>
* [' L, h- Q2 o, Y<P>But ........</P>8 x" Z0 g3 S  I5 j* x) V
<P>如果用</P>5 P" b1 x, k  K/ i( }' E% A$ r
<P>  fgets(str1,4,file1);</P>( d' O' u3 q+ w3 V
<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>
+ J" l7 ?( q; s<P>  fgets(str1,23,file1);</P>% F' I. k0 }  @3 x
<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>
2 o" b3 Q3 W2 S8 ^  o, A( I3 \<P>8.fprintf()
* M9 Q$ {. _" S% f" f  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>
4 x& @5 t1 O+ q<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>
8 I, V  _3 \4 H+ }<P>9.fscanf(). j5 F% t, ?# ~3 Y. {! ^
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>
, v9 B! N' T' C3 o<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>
2 z2 t2 P2 H" H. I( ^  ~<P>10.feof()
( E% ]( H5 G7 o" k  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>
9 b7 z/ g2 S3 x2 u<P>例:if(feof(fp))printf("已到文件尾");</P>
- n0 a: [3 Z  s, B& u<P>11.ferror()
/ D  F* f9 J4 F  U0 I  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>
% O" {. }4 Z6 Q, d; ]<P>例:printf("%d",ferror(fp));</P>
" v( K( a" {2 u% B+ g<P>12.rewind()
6 V7 X  J3 Z6 N: e) D& V  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>6 b' \0 z. A( j
<P>例:rewind(fp);</P>1 j  h0 m4 {8 K+ W
<P>12.remove(). m# n1 o' j; P5 A
  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>
+ o# ]0 e' K# s( g' U+ R<P>例:remove("c:\\io.sys");</P>
6 O% e% q9 N( B6 [( O4 S<P>13.fread(). l& h: n8 g+ f$ ]9 o
  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
3 d9 W, z! t/ i- I" z- R8 Y: N<P>例:</P>
( v$ k. m- V) M* A$ u9 |<P>  char x[4230];
: ~7 A% I& W1 Y: H; Z1 Q; [9 B- b  FILE *file1=fopen("c:\\msdos.sys","r");
) J4 F. s: K  f& B' z/ E4 S5 `  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>
; t% H) m$ H4 x' `; Y<P>14.fwrite()
5 x; E" j; M4 J9 D  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>* Q9 n% c' b1 R" A4 T5 D4 h$ A4 v
<P>例:</P>, [! y, m/ n  {: G" O2 Y  N5 Q3 ^
<P>  char x[]="I Love You";
# K' K4 o0 k6 I* F7 h  fwire(x, 6,12,fp);//写入6*12=72字节</P>
" V: k. L% S7 E6 y/ c5 b0 B( s<P>  将把"I Love"写到流fp中12次,共72字节</P>1 g# A) W$ Q; k; z5 M& L& t
<P>15.tmpfile()
: K& I/ w& [/ D& }% k! r; D  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>* V; n, X) n6 T6 Y
<P>例:FILE *fp=tmpfile();</P>
& k! q7 O/ ?: a& n$ l<P>16.tmpnam();; ^' d& V) T2 o: \" l/ n% x
  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>
2 {' Y$ M& P0 m. X# ?# X! ^5 z0 a: B% ^0 H
<P>& h& l0 c$ ]. F8 D$ K0 b0 L6 T
</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-14 12:02 , Processed in 0.435132 second(s), 52 queries .

回顶部