数学建模社区-数学中国

标题: borland c++ bulder的文件操作总结-2 [打印本页]

作者: 韩冰    时间: 2005-1-26 13:08
标题: borland c++ bulder的文件操作总结-2
<>二、直接I/O文件操作6 g, |6 P' ~7 z, ?. ]( n& m
  这是C提供的另一种文件操作,它是通过直接存/取文件来完成对文件的处理,而上篇所说流式文件操作是通过缓冲区来进行;流式文件操作是围绕一个FILE指针来进行,而此类文件操作是围绕一个文件的“句柄”来进行,什么是句柄呢?它是一个整数,是系统用来标识一个文件(在WINDOWS中,句柄的概念扩展到所有设备资源的标识)的唯一的记号。此类文件操作常用的函数如下表,这些函数及其所用的一些符号在io.h和fcntl.h中定义,在使用时要加入相应的头文件。</P>
: s: W7 ^2 o3 V. r6 P# U8 ?<>函数 说明 0 h. N9 y9 ~! B+ t2 g+ G+ B' }
open() 打开一个文件并返回它的句柄 6 H0 q6 v: B- W% v
close() 关闭一个句柄
6 R; Y" k' {! p6 r, L! X7 R# alseek() 定位到文件的指定位置
1 p3 G; k$ r- i+ F' [5 r9 D+ p! @read() 块读文件 6 W2 C$ {9 H8 S* g, S; m
write() 块写文件 % l0 m% x9 g# V3 H0 r) C( g: y6 i
eof() 测试文件是否结束 ) N7 X, M7 h  C) q
filelength() 取得文件长度
2 @: l  R( X$ k$ krename() 重命名文件
% s7 q2 ~4 @% k' U- y; Y* n- Xchsize() 改变文件长度 </P>
( t3 N. U; W1 ^( ]4 J+ u( B<>  下面就对这些函数一一说明:</P>
% O0 x0 {1 W2 `$ j<>1.open()
, s, {& N4 j) D$ M0 {8 Z- J  打开一个文件并返回它的句柄,如果失败,将返回一个小于0的值,原型是int open(const char *path, int access [, unsigned mode]); 参数path是要打开的文件名,access是打开的模式,mode是可选项。表示文件的属性,主要用于UNIX系统中,在DOS/WINDOWS这个参数没有意义。其中文件的打开模式如下表。</P>9 _4 v3 c9 a. P" `. \9 _
<>符号 含义 符号 含义 符号 含义 2 x; R$ Z3 m, ?; u" Z5 s
O_RDONLY 只读方式 O_WRONLY 只写方式 O_RDWR 读/写方式 9 K6 J7 {" r- ^: k, T# v' P" S
O_NDELAY 用于UNIX系统 O_APPEND 追加方式 O_CREAT 如果文件不存在就创建
% M- G4 T) Y) |! XO_TRUNC 把文件长度截为0 O_EXCL 和O_CREAT连用,如果文件存在返回错误 O_BINARY 二进制方式 ; x- J! d( ]9 q6 C
O_TEXT 文本方式 </P>9 |- E8 Q5 t. b8 K3 f+ a. s. ?
<>  对于多个要求,可以用"|"运算符来连接,如O_APPEND|O_TEXT表示以文本模式和追加方式打开文件。</P>
: T- a% {4 {* ~<>例:int handle=open("c:\\msdos.sys",O_BINARY|O_CREAT|O_WRITE)</P>+ |" `8 i  a" s  S0 i& ]- }) k. o
<>2.close()
* c  l0 m9 @$ k1 ~' e& R, L  关闭一个句柄,原型是int close(int handle);如果成功返回0</P>
( W0 v: @; v3 K) O3 v" S: C) w0 K3 Z<>例:close(handle)</P>
2 C  @: M$ H( s( ~0 ^<>3.lseek()  X) I# h/ e$ q
  定位到指定的位置,原型是:long lseek(int handle, long offset, int fromwhere);参数offset是移动的量,fromwhere是移动的基准位置,取值和前面讲的fseek()一样,SEEK_SET:文件首部;SEEK_CUR:文件当前位置;SEEK_END:文件尾。此函数返回执行后文件新的存取位置。</P>
( b' s* h9 l& L( _& S, G* C: W<>例:</P>7 ^' q$ S1 J6 L5 w4 S. c
<>  lseek(handle,-1234L,SEEK_CUR);//把存取位置从当前位置向前移动1234个字节。7 a& k! h5 l  |! B( t+ _
  x=lseek(hnd1,0L,SEEK_END);//把存取位置移动到文件尾,x=文件尾的位置即文件长度</P>; d) k, [# l8 h$ U3 w/ c2 c  n
<>4.read()
  h0 n8 P# `" [) L+ ?4 l4 W  从文件读取一块,原型是int read(int handle, void *buf, unsigned len);参数buf保存读出的数据,len是读取的字节。函数返回实际读出的字节。</P>
* X- `9 f: }7 H, }<>例:char x[200];read(hnd1,x,200);</P>
. {: _  R& u- i; D4 t: v2 o<>5.write()
+ u5 R" B/ N- ]! C  写一块数据到文件中,原型是int write(int handle, void *buf, unsigned len);参数的含义同read(),返回实际写入的字节。</P>
+ j% r  O5 R8 `) ~: ]* v<>例:char x[]="I Love You";write(handle,x,strlen(x));</P>+ U7 q" V( R, v7 n3 g8 {: s. z& R
<>7.eof()" b9 ~% h# D# A# J0 h
  类似feof(),测试文件是否结束,是返回1,否则返回0;原型是:int eof(int handle);</P>
9 v/ c6 N( s7 [+ @' }<>例:while(!eof(handle1)){……};</P>$ X& j" _" j7 l9 I
<>8.filelength()
4 k  [5 ?% V( K6 m* m  返回文件长度,原型是long filelength(int handle);相当于lseek(handle,0L,SEEK_END)</P>' Q0 A" m  E/ ]7 f, Q5 N& Y/ z& d
<>例:long x=filelength(handle);</P>( C+ T: M0 h% ^' p
<>9.rename()
$ ^) V1 ?& d. W4 ^# z  重命名文件,原型是int rename(const char *oldname, const char *newname); 参数oldname是旧文件名,newname是新文件名。成功返回0</P>8 p% ~8 S9 G* l! F/ F
<>例:rename("c:\\config.sys","c:\\config.w40");</P>& H) ?1 g! ^' J8 T! x
<>10.chsize();
4 I( `' b# L+ }; _" A2 L+ G1 G$ a  改变文件长度,原型是int chsize(int handle, long size);参数size表示文件新的长度,成功返回0,否则返回-1,如果指定的长度小于文件长度,则文件被截短;如果指定的长度大于文件长度,则在文件后面补'\0'。</P>. e% B! O2 N5 z6 B
<>例:chsize(handle,0x12345);</P>. f" B* D9 g' w$ ?# W
<>
6 m6 c, P& ~& e8 A3 y--------------------------------------------------------------------------------</P>
' v6 U: s# q; h1 r& d6 o# t<>  如果熟悉汇编可能会发现这种方式和汇编语言的DOS功能调用句柄式文件操作很像,比如open()就像DOS服务的3CH号功能调用,其实这种操作还有两种类型的函数就是直接用DOS功能来完成的,如_open(),_dos_open()等等。有兴趣可自已查询BCB的帮助。</P>- C8 v, l) ?2 s/ i$ g
<>  同流式文件操作相同,这种也提供了Unicode字符操作的函数,如_wopen()等等,用于9X/NT下的宽字符编程,有兴趣可自已查询BCB的帮助。</P>3 z+ [- N7 G" ]. \" g
<>  另外,此种操作还有lock(),unlock(),locking()等用于多用户操作的函数,但在BCB中用得并不多,我就不介绍了,但如果要用C来写CGI,这些就必要的常识了,如果你有这方面的要求,那就得自已好好看帮助了。</P>
' x* n& e3 s" D<>  到这里,我就把基于C的文件操作介绍完了,下一篇将介绍基于C++的文件操作,敬请期待。</P>5 [' X4 m9 }  Y
<>
! ~+ E/ h) d+ A1 v</P>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5