QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作
( `9 |$ s; J; ]6 B4 G5 W& s  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>5 m  P7 H" C- _* g2 S
<>一、流式文件操作
% H) }4 b" d% v& c  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>
# w/ Z8 E* s* }2 N<>typedef struct {
: H: y" F# o; e6 ~* N/ d( J7 Sint level; /* fill/empty level of buffer */
! m3 k' w+ s( ], sunsigned flags; /* File status flags */
8 d  f% G0 h9 d8 Qchar fd; /* File descriptor */& u1 N7 Y2 T. e) l
unsigned char hold; /* Ungetc char if no buffer */1 A$ U! U) m1 r8 m. K
int bsize; /* Buffer size *// g% S- r6 E" z% _5 ?
unsigned char _FAR *buffer; /* Data transfer buffer */0 n1 o- g1 u3 Q
unsigned char _FAR *curp; /* Current active pointer */
& N' Z8 ?2 Q4 e+ M7 }unsigned istemp; /* Temporary file indicator */: L. [0 b& s9 g& W& c
short token; /* Used for validity checking */' |+ p3 s  }5 f: ]# o. n
} FILE; /* This is the FILE object */</P>
' r& N: u4 i% D3 f( j<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能 ) ]! {8 ~, V9 w' n2 {5 t
fopen() 打开流 1 \: W; z* Z1 U8 x' q7 U
fclose() 关闭流
4 `* R8 l. v2 B. ]- ^) W0 |6 Nfputc() 写一个字符到流中 * f3 w$ k% N0 ?; d7 t
fgetc() 从流中读一个字符 & G$ i- j& Z6 [4 H- y
fseek() 在流中定位到指定的字符
, o/ m% F3 c6 J2 ~+ {fputs() 写字符串到流
) k, W8 _, ]( x0 r4 k; wfgets() 从流中读一行或指定个字符 - B1 V3 }- f) U: t
fprintf() 按格式输出到流 # \- Y7 y7 C7 i+ d# ^( }
fscanf() 从流中按格式读取   [) J& b" n3 g) b3 v' j4 ?/ F
feof() 到达文件尾时返回真值
+ e) ]) b. V; R6 Pferror() 发生错误时返回其值
" q8 z' q" L- U4 [4 krewind() 复位文件定位器到文件开始处 ( A6 n. x' U' m! r) C5 i- c# O5 B
remove() 删除文件
' O9 v1 B6 ^$ k5 w' }4 u5 `% Jfread() 从流中读指定个数的字符
& Y  M+ J8 |$ @6 G8 yfwrite() 向流中写指定个数的字符
# S& _. W( m; D, gtmpfile() 生成一个临时文件流
' c2 L) [" B% a3 ?- k+ F8 Atmpnam() 生成一个唯一的文件名 </P>; v" E  H) U0 D/ t1 W
<>
$ @# D) x% @/ Q4 L  下面就介绍一下这些函数</P>
% {: R. T4 D3 H( J3 c3 o4 z2 w<>1.fopen()
# K2 b6 U2 [& a. x# B% d6 H  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>
) J4 S% a& X3 N( U<>为使用而打开一个流 ) Y. k$ n2 Z2 e
把一个文件和此流相连接 ( v; B, l6 N/ o; d- p, p8 S
给此流返回一个FILR指针& ?  H4 D8 G" `6 O3 t4 z/ O
参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>- ^: A1 k1 u0 K# j2 S8 g5 a
<>字符串 含义
  l+ }+ P& O2 a) R' U3 b"r" 以只读方式打开文件 1 w+ y, r0 f" k- M
"w" 以只写方式打开文件
% l- P; q; a) g* `1 K3 y: _: N"a" 以追加方式打开文件
3 O' e2 L$ f) u"r+" 以读/写方式打开文件,如无文件出错 * H  o; |5 h- C; e( E; c; l
"w+" 以读/写方式打开文件,如无文件生成新文件 </P>0 I; ]8 X; y0 S5 g4 x' ]" E* U0 t
<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>% O% j; M: e: `8 _
<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>, m" C+ C. `: r" u6 u9 [- y
<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>
' n3 \. v( w' ?! i<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>
3 r! P% l9 b$ ^1 C" W. Z<>例:</P>
) U3 W7 V6 Z# }6 V) y2 F<>  FILE *fp;
& i' ^% n$ N: B! ~+ F$ G+ b  if(fp=fopen("123.456","wb"))! D# v. G+ ~' t) u
    puts("打开文件成功");6 [8 Y( o7 K" d6 j5 e
  else
3 G* B8 o" Z* q  b    puts("打开文件成败"); </P>
; q6 w* O  e0 h8 \<>2.fclose()
$ Z: R$ w  ~8 h3 r" I- e2 F  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>2 W2 r! j: o  v8 F
<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>
& P- a( q8 Z" w( U$ Y9 r<>例:fclose(fp);</P>
. _; d3 K( c+ @# U# b  B/ o4 U<>3.fputc()/ C- U+ H" G$ h) W
  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>
" J# X7 Z; o( V<>例:fputc('X',fp);</P>0 M+ n4 B2 k4 K7 G
<>4.fgetc()
8 l$ B; x/ e& `1 h4 N! ^0 [2 O) t  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>1 E% p1 z  h0 g" z
<>例:char ch1=fgetc(fp);</P>  E  D! N# ]& C0 x
<>5. fseek()
* i9 E/ s! G1 ^, O3 a$ c  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P># d; z4 T" ~% p. Z% Z; [
<>符号常量 值 基准位置
* X: g' i! S( ~4 \- Q- J! d9 X2 L" NSEEK_SET 0 文件开头
& B" X# \+ X- q2 B$ S" mSEEK_CUR 1 当前读写的位置
8 z9 q6 R- ]. B$ y( M- Z. ySEEK_END 2 文件尾部 </P>  s% p$ Y5 p! f9 [" J- F
<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>
. j4 o9 E$ \# R  e<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>8 U: X& E) {1 L
<>6.fputs()3 g' }/ n" t6 x& G
  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>1 ?0 o; }& `0 d2 P: P. p
<>例:fputs("I Love You",fp);</P>1 U' H$ \3 o6 ]7 N- }- z
<>7.fgets()6 ~1 N6 R# o# @) p1 I4 ?1 o
  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>
; |% ]- W2 `8 R1 L2 K<>例:如果一个文件的当前位置的文本如下</P>
- q5 M- o4 s, X; u! E9 u& Z: D<>Love ,I Have</P>
; ^; h: f3 _7 J( R! K2 M6 l: ?<P>But ........</P>* T! k3 c7 y: q: u
<P>如果用</P>; ]' C/ p5 ?4 O7 R, W
<P>  fgets(str1,4,file1);</P>8 @; w6 f/ {& p) I5 r% i+ S
<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>, [  \- t6 a* G' C& ]6 z# n& [8 d
<P>  fgets(str1,23,file1);</P>
: r' |6 A  [! ^* I; ]<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>( F0 W$ h1 `8 K0 S) ?
<P>8.fprintf()
- j& C8 k; h0 ]0 g" O/ U% ]4 f  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>& n. T7 s* N$ p# N8 _: o
<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>
7 B4 J/ a/ A5 H# p+ F, R: {' D* I<P>9.fscanf()0 o# e, v: W9 v& E# h' z) n
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>9 g* z( n8 e( Q0 d
<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>
0 d3 a) R# b$ L# r' K<P>10.feof(); O" C' ~8 l, K6 P6 z
  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>5 \8 }# n/ B& s$ [7 D
<P>例:if(feof(fp))printf("已到文件尾");</P>7 n- R( L  Y+ T% n" }5 v
<P>11.ferror()& w+ D( M/ b; I+ t% G
  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>- V- v0 T, Y6 [5 s9 F# e
<P>例:printf("%d",ferror(fp));</P>! w( f( ^2 E* o4 H
<P>12.rewind()
- U* Y) ^6 Y, K+ p: Q  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>. `% S4 @7 \: c9 ?: _9 {" l4 w+ [
<P>例:rewind(fp);</P>
; M0 f. |7 N* G8 f' W( H7 [5 M<P>12.remove()
: L. |" G7 G( a  G2 Z  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>
6 K% V7 j, G! z% |4 U$ _' A" i4 c<P>例:remove("c:\\io.sys");</P>
4 j- j7 k' _! l% p<P>13.fread()3 h( }2 N3 M% D  m+ ~
  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
) _3 R+ x7 g& {7 H<P>例:</P>
1 q3 {8 ^" P' T& K<P>  char x[4230];/ z4 U# l) w$ M" S4 K4 M5 e8 E
  FILE *file1=fopen("c:\\msdos.sys","r");
% @' L6 o1 w, c  Y  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>
; v5 v" l. ~! Z* }  F2 k% `( M' h<P>14.fwrite()
( y- \0 c7 l5 q- _& O  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
/ l# y, w2 j  N<P>例:</P>6 z7 `1 u: t' p, k' \
<P>  char x[]="I Love You";. `- {4 K; L, u& C  Q# i
  fwire(x, 6,12,fp);//写入6*12=72字节</P>
" l. O3 p- P: u4 a% e<P>  将把"I Love"写到流fp中12次,共72字节</P>
# h. Y# H6 B. G/ w/ S! V<P>15.tmpfile()
7 E# n0 d8 y/ M, ?4 Y5 G  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>" Y& C* o9 K$ E& _# L, K
<P>例:FILE *fp=tmpfile();</P>
& h% ~$ w3 o4 {7 @( i9 X9 ~<P>16.tmpnam();3 E  i. N1 d/ q- Z
  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>
% i* T/ e( d+ A7 w
1 ]/ r% u: A& Y9 A<P>0 C3 T" H  N. P1 o2 i) S
</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-6-27 11:48 , Processed in 0.801459 second(s), 51 queries .

回顶部