QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 13:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>、基于C的文件操作
- K) f% o& B  O. h, ?  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。</P>! G; H( K- m( t+ N! U" K" c
<>一、流式文件操作
# q& S, u/ y( c- x  这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:</P>
- u! ]7 x- j- w. R' Q2 O<>typedef struct {/ n7 X& M" y# V' Y; a) w. D" w  Q
int level; /* fill/empty level of buffer */
) \5 ]8 K2 Q0 e  cunsigned flags; /* File status flags */) H2 Y7 w" M, g3 v* N! a
char fd; /* File descriptor */3 @& a' E6 O: Z  Y/ t& R7 Q5 k/ ?
unsigned char hold; /* Ungetc char if no buffer */
' d, L  k5 q5 J& L; Rint bsize; /* Buffer size */( D( n+ W! V$ P- ?: K
unsigned char _FAR *buffer; /* Data transfer buffer */
1 x: c+ K) f% q* O9 Iunsigned char _FAR *curp; /* Current active pointer */" ?# f( @8 G8 v
unsigned istemp; /* Temporary file indicator */
2 T( |" o  n! `7 i/ y/ ?( {short token; /* Used for validity checking */
/ d+ s& u% d5 O" E3 T5 ?2 Z} FILE; /* This is the FILE object */</P>
5 `$ |1 o+ E. E<>  FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能
; p0 i1 T+ Q& H3 o. t+ v9 Qfopen() 打开流
  @( @# x9 y2 ^! Vfclose() 关闭流 * g8 H" [, I& P6 u9 s- k8 `
fputc() 写一个字符到流中 # \0 J' s7 I- x+ l
fgetc() 从流中读一个字符 - {4 g- q6 M% u
fseek() 在流中定位到指定的字符 0 g+ q) a9 t' ~6 G; d6 @/ M
fputs() 写字符串到流
% G9 n! l3 S: O* [6 C' s/ S# ffgets() 从流中读一行或指定个字符
- q7 w9 X% {, F. A$ T8 x9 Ofprintf() 按格式输出到流 0 M( L8 k3 Q: M/ L6 v9 \+ X
fscanf() 从流中按格式读取
2 V0 |. A. @* ^7 Xfeof() 到达文件尾时返回真值
" i$ v# d4 n, N: N0 Zferror() 发生错误时返回其值
, I, ~  \* U4 U2 srewind() 复位文件定位器到文件开始处
3 l$ b; B  M2 u4 ~/ m8 Wremove() 删除文件 0 B/ z5 ~+ \) [4 v
fread() 从流中读指定个数的字符
' l$ q8 f+ D6 o, |0 jfwrite() 向流中写指定个数的字符
8 A. {: p" r  O  i! A: t( htmpfile() 生成一个临时文件流 3 b: C# }- A# z9 O# X
tmpnam() 生成一个唯一的文件名 </P>* P. F: w: Y2 i0 i$ N3 G& ~
<>" D! G! U/ U' ^2 B+ N9 A0 P# k
  下面就介绍一下这些函数</P>
$ v4 J' h  ^& y! W& @<>1.fopen()
1 t0 B1 u: v; I7 s  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能</P>5 I0 Y7 U, l/ U
<>为使用而打开一个流 - F3 O' C1 {5 L$ c# a: c, j1 [
把一个文件和此流相连接
3 r5 f/ N3 r: _8 x0 R, T- H) }给此流返回一个FILR指针' v( w, f' g8 q! ?; C3 K  u
参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表</P>
9 \# M6 K1 q: F6 C/ W<>字符串 含义
: U, \$ ~$ B" k( B% J3 R"r" 以只读方式打开文件 ) b8 W& f- ^/ n! V' k
"w" 以只写方式打开文件
' b. `* {+ |" x* S/ F8 Z) @  g1 v1 X"a" 以追加方式打开文件
4 \, m9 r& K$ k8 j0 S* w2 g' j! N"r+" 以读/写方式打开文件,如无文件出错
3 |$ f' r- d+ E8 o: T" _+ z"w+" 以读/写方式打开文件,如无文件生成新文件 </P>
# [$ }8 d* D; J- L: N% V<>  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。</P>  q4 e$ S; b% E  A% h" I
<>  系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。</P>
7 c: g( g6 i6 g4 g3 U  n<>  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。</P>* p5 R& A- m: z8 N  g* V4 f; K
<>  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。</P>
# l" b, Z$ j7 O& c<>例:</P>
2 V$ G6 y7 E: \$ E1 K7 {<>  FILE *fp; * @+ m% M9 ]" E' o2 g0 F
  if(fp=fopen("123.456","wb"))
( l$ i- d- E$ G8 f# T    puts("打开文件成功");
$ {* Q. }6 E2 x" w  else ) V# Z. }) L  B5 O
    puts("打开文件成败"); </P>
; {6 I: a% a) T1 o8 w# O& h<>2.fclose()
! g7 `+ h- l& c/ v) k  fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。</P>
7 S7 q3 A( P. z& e, k. K<>  在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。</P>5 G% J  ~. ~2 k( Q2 O, n
<>例:fclose(fp);</P>
8 j5 }+ y4 M5 d+ X<>3.fputc()+ ?: N/ @- g/ r# o# r" ?+ k% D
  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。</P>7 s' W3 b5 ^( k; u% S# U9 n
<>例:fputc('X',fp);</P>3 I# g( Y& i4 U# ]
<>4.fgetc()7 n( Y$ k: \, h$ d" L& T. f: t
  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。</P>
- V+ W0 e, L8 {& k5 Y. |! B: s3 b<>例:char ch1=fgetc(fp);</P>+ A# ^, J5 G; G
<>5. fseek()
( k( I' J& |& q% b  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是</P>+ h. O8 M. l1 t1 j; W- X7 E9 V
<>符号常量 值 基准位置 ! m* ~  W" ~/ P( k% S
SEEK_SET 0 文件开头 ! R4 Q+ S6 b/ r$ G
SEEK_CUR 1 当前读写的位置 9 r/ w) P* ]5 `6 S- Y; a6 U
SEEK_END 2 文件尾部 </P>5 \5 R* q) t8 `& }. }+ T
<>例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</P>
% R# ^  c. z: n. X: ~" p) Q<>  fseek(fp,0L,2);//把读写位置移动到文件尾</P>6 T3 g* b0 y; h  S8 j$ x
<>6.fputs()+ D6 x* j; ^. v- e# o8 s( e$ u% ^& U
  写一个字符串到流中,原型int fputs(const char *s, FILE *stream); </P>
7 A, ]) w+ {" r9 p$ D<>例:fputs("I Love You",fp);</P>
" g7 w4 z( Q/ g+ F4 k<>7.fgets()% A9 P" e0 u4 D2 i
  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。</P>
, b+ `' W: _& v<>例:如果一个文件的当前位置的文本如下</P>
% D$ S$ Z9 b& p! v1 Q. \* t<>Love ,I Have</P>( t4 C$ [) W, }! n. r
<P>But ........</P>- t0 s& X# q$ {+ m5 [- T
<P>如果用</P>0 R9 }+ f. |1 H# {. f
<P>  fgets(str1,4,file1);</P>
7 I; N* m) ^! f. |# J4 h; i<P>则执行后str1="Lov",读取了4-1=3个字符,而如果用</P>$ N, u, F. u1 r$ {5 X
<P>  fgets(str1,23,file1);</P>2 x! t. U% h4 I' D9 O) H- w
<P>则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。</P>
' `/ e& `, `; l<P>8.fprintf()
) `; W4 m4 ]- @. v( _  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了</P>
# O$ t: x1 s! l<P>例:fprintf(fp,"%2d%s",4,"Hahaha");</P>8 d" R6 |2 w" D1 R6 S* g
<P>9.fscanf()# W! J- k2 ]* v9 y% z( ?$ o# Q
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。</P>8 U, I  F& f7 N* Z4 [$ [3 T' I! z
<P>例:fscanf(fp,"%d%d" ,&amp;x,&amp;y);</P>
+ [% l8 J$ |  m; Z<P>10.feof()
4 z* T2 m1 _7 n3 C! @& G  检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);</P>
  q/ e" q! ~: ?0 S5 k# O: p<P>例:if(feof(fp))printf("已到文件尾");</P>
: i" t2 L. r7 p/ X7 V/ E6 x<P>11.ferror()
- K$ Q$ g: U; e1 N0 ?! b' O  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);</P>2 W. M1 b- ^& J) ~! D
<P>例:printf("%d",ferror(fp));</P>6 b& f3 W, E8 f6 b& k6 T4 {' L: I! t
<P>12.rewind()
+ ]: V7 L* B6 j( d' `  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</P>1 {0 w" C' K' S: F6 i# U* B
<P>例:rewind(fp);</P>
2 H& O5 I# o' X# X. _- _<P>12.remove()) p; {! r+ `# Z. v8 A
  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。</P>
% u5 [' d* ?9 T1 u' F8 U' I<P>例:remove("c:\\io.sys");</P>
% |; e/ Q7 S4 \7 M) [<P>13.fread()
" K7 z' E# {1 H- u  从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>3 ?# n- u0 j! _. P! p8 Q( X3 G
<P>例:</P>
- K/ H3 n/ l/ q<P>  char x[4230];
5 b. C3 Z7 h( K; @! d  FILE *file1=fopen("c:\\msdos.sys","r");1 |8 b! ^* G( W: o& e7 n
  fread(x,200,12 ,file1);//共读取200*12=2400个字节</P>) l0 u; S4 e4 u; B
<P>14.fwrite()) w8 v+ }& [/ p! U/ {- b
  与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。</P>
; j, a1 t' V  ]<P>例:</P>
. b. T9 d' ]" w- M6 T; e6 v<P>  char x[]="I Love You";
' \+ B( G' L# s) \% Y) H. v  fwire(x, 6,12,fp);//写入6*12=72字节</P>
1 P' S" r" n; Y) y5 K6 O; }1 Z<P>  将把"I Love"写到流fp中12次,共72字节</P>
9 H3 z) e0 V& Y  y4 n' t0 n% B<P>15.tmpfile()0 W  J" {8 |3 H, r, Q8 K
  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。</P>
3 |& l% M$ o! w% v7 c* F<P>例:FILE *fp=tmpfile();</P>
: E) K# ?6 i; N( Z2 E5 v<P>16.tmpnam();$ F) L9 K, g& R9 h7 J$ P# _
  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。</P>
" M( f2 }5 A! r
- T9 G4 A. g# I4 I<P>
& Y9 v+ }, m" x+ Z3 i </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 06:41 , Processed in 0.454601 second(s), 52 queries .

回顶部