第12章 文 件(下)

来源:互联网 发布:枯之一叶 天下知秋 编辑:程序博客网 时间:2024/05/22 00:15
飞的连接 发表于 2005-5-27 18:27:00

http://haoblog.com/user1/1978/archives/2005/14815.html

12.3.3  读/写一个数据块──fread()fwrite()

实际应用中,常常要求1次读/写1个数据块。为此,ANSI  C 标准设置了 fread( ) fwrite()函数。

 1.用法:

int  fread(void *bufferint sizeint countFILE *fp)

int  fwrite(void *bufferint sizeint countFILE *fp)

2.功能:

fread()──从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size* count个字节。

其中,buffer是存放读入数据的起始地址(即存放何处)。

fwrite()──从buffer开始,一次输出size个字节,重复count次, 并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size* count个字节。

其中,buffer是要输出数据在内存中的起始地址(即从何处开始输出)。

如果调用fread()fwrite()成功,则函数返回值等于count

fread()fwrite()函数,一般用于二进制文件的处理。

12.3.4  对文件进行格式化读/写──fscanf()fprintf()函数

  scanf()printf()函数的功能相似,区别在于:fscanf()fprintf()函数的操作对象是指定文件,而scanf()printf()函数的操作对象是标准输入(stdin)输出(stdout)文件。

  int  fscanf(文件指针,"格式符",输入变量首地址表);

  int  fprintf(文件指针,"格式符",输出参量表);

 例如,......

        int i=3; float f=9.80;

        ......

        fprintf(fp,"%2d,%6.2f", i, f);

         ......

 fprintf()函数的作用是,将变量i%2d格式、变量f%6.2f格式, 以逗号作分隔符,输出到fp所指向的文件中: 3,  9.80 表示1个空格)。

12.3.5  读/写函数的选用原则

从功能角度来说,fread()fwrite()函数可以完成文件的任何数据读/写操作。 但为方便起见,依下列原则选用:

 1.读/1个字符(或字节)数据时:选用fgetc()fputc()函数。

 2.读/1个字符串时:选用fgets()fputs()函数。

 3.读/1个(或多个)不含格式的数据时:选用fread()fwrite()函数。

 4.读/1个(或多个)含格式的数据时:选用fscanf()fprintf()函数。

12.4   位置指针与文件定位

文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。
       如果想改变系统这种读写规律,可使用有关文件定位的函数。

 12.4.1  位置指针复位函数rewind()

 1.用法:int  rewind(文件指针);

 2.功能:使文件的位置指针返回到文件头。

 12.4.2  随机读写与fseek()函数

 对于流式文件,既可以顺序读写,也可随机读写,关键在于控制文件的位置指针。
        所谓顺序读写是指,读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上。

所谓随机读写是指,读写完当前数据后,可通过调用fseek()函数,将位置指针移动到文件中任何一个地方。

 1.用法:int  fseek(文件指针,位移量,参照点);

 2.功能:将指定文件的位置指针,从参照点开始,移动指定的字节数。

1)参照点:用0(文件头)、1(当前位置)和2(文件尾)表示。

ANSI C标准中,还规定了下面的名字:

          SEEK_SET──文件头,

          SEEK_CUR──当前位置,

          SEEK_END──文件尾

2)位移量:以参照点为起点,向前(当位移量>0时)或后(当位移量<0时)移动的字节数。在ANSI C标准中,要求位移量为long int型数据。

fseek()函数一般用于二进制文件

12.4.3  返回文件当前位置的函数ftell()

由于文件的位置指针可以任意移动,也经常移动,往往容易迷失当前位置,ftell()就可以解决这个问题。

 1.用法:long  ftell(文件指针);

 2.功能:返回文件位置指针的当前位置(用相对于文件头的位移量表示)。

 如果返回值为-1L,则表明调用出错。例如:

          offset=ftell(fp)

          if(offset= =-1L)printf(“ftell() error/n”)

12.5       出错检测

12.5.1  ferror()函数
       在调用输入输出库函数时,如果出错,除了函数返回值有所反映外,也可利用ferror()函数来检测。
         1.用法: int  ferror(文件指针)

  2.功能:如果函数返回值为0,表示未出错;如果返回一个非0值,表示出错。
      1)对同一文件,每次调用输入输出函数均产生一个新的ferror()函数值。因此在调用了输入输出函数后,应立即检测,否则出错信息会丢失。
       2)在执行fopen()函数时,系统将ferror()的值自动置为0

12.5.2  clearerr()函数

1.用法: void  clearerr(文件指针)

2.功能:将文件错误标志(即ferror()函数的值)和文件结束标志(即feof()函数的值)置为0
 
对同一文件,只要出错就一直保留,直至遇到clearerr()函数或rewind()函数,或其它任何一个输入输出库函数。