C语言文件操作函数大全

来源:互联网 发布:东安格利亚大学知乎 编辑:程序博客网 时间:2024/06/10 05:31


   表头文件 #include<stdio.h>

   定义函数 void clearerr(FILE * stream);

   函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标。

   返回值

   fclose(关闭文件)

   相关函数 close,fflush,fopen,setbuf

   表头文件 #include<stdio.h>

   定义函数 int fclose(FILE * stream);

   函数说明 fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

   返回值 若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。

   错误代码 EBADF表示参数stream非已打开的文件。

   范例 请参考fopen()。

   fdopen(将文件描述词转为文件指针)

   相关函数 fopen,open,fclose

   表头文件 #include<stdio.h>

   定义函数 FILE * fdopen(int fildes,const char * mode);

   函数说明 fdopen()会将参数fildes 的文件描述词,转换为对应的文件指针后返回。参数mode 字符串则代表着文件指针的流形态,此形态必须和原先文件描述词读写模式相同。关于mode 字符串格式请参考fopen()。

   返回值 转换成功时返回指向该流的文件指针。失败则返回NULL,并把错误代码存在errno中。

   范例

   #include<stdio.h>

    main()

    {

    FILE * fp =fdopen(0,”w+”);

    fprintf(fp,”%s\n”,”hello!”);

    fclose(fp);

    }

   执行 hello!

   feof(检查文件流是否读到了文件尾)

   相关函数 fopen,fgetc,fgets,fread

   表头文件 #include<stdio.h>

   定义函数 int feof(FILE * stream);

   函数说明 feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0。

   返回值 返回非零值代表已到达文件尾。

   fflush(更新缓冲区)

   相关函数 write,fopen,fclose,setbuf

   表头文件 #include<stdio.h>

   定义函数 int fflush(FILE* stream);

   函数说明 fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中。如果参数stream为NULL,fflush()会将所有打开的文件数据更新。

   返回值 成功返回0,失败返回EOF,错误代码存于errno中。

   错误代码 EBADF 参数stream 指定的文件未被打开,或打开状态为只读。其它错误代码参考write()。

  fgetc(由文件中读取一个字符)

   相关函数 open,fread,fscanf,getc

   表头文件 include<stdio.h>

   定义函数 nt fgetc(FILE * stream);

   函数说明 fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。

   返回值 getc()会返回读取到的字符,若返回EOF则表示到了文件尾。

   范例

   #include<stdio.h>

    main()

    {

    FILE *fp;

    int c;

    fp=fopen(“exist”,”r”);

    while((c=fgetc(fp))!=EOF)

    printf(“%c”,c);

    fclose(fp);

    }

   fgets(由文件中读取一字符串)

   相关函数 open,fread,fscanf,getc

   表头文件 include<stdio.h>

   定义函数 har * fgets(char * s,int size,FILE * stream);

   函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。

   返回值 gets()若成功则返回s指针,返回NULL则表示有错误发生。

   范例

   #include<stdio.h>

    main()

    {

    char s[80];

    fputs(fgets(s,80,stdin),stdout);

    }

   执行 this is a test /*输入*/

   this is a test /*输出*/

   fileno(返回文件流所使用的文件描述词)

   相关函数 open,fopen

   表头文件 #include<stdio.h>

   定义函数 int fileno(FILE * stream);

   函数说明 fileno()用来取得参数stream指定的文件流所使用的文件描述词。

   返回值 返回文件描述词。

   范例

   #include<stdio.h>

    main()

    {

    FILE * fp;

    int fd;

    fp=fopen(“/etc/passwd”,”r”);

    fd=fileno(fp);

    printf(“fd=%d\n”,fd);

    fclose(fp);

    }

   执行 fd=3

   fopen(打开文件)

   相关函数 open,fclose

   表头文件 #include<stdio.h>

   定义函数 FILE * fopen(const char * path,const char * mode);

 

函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

   mode有下列几种形态字符串:

   r 打开只读文件,该文件必须存在。

   r+ 打开可读写的文件,该文件必须存在。

   w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

   w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

   a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

   a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

   上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。

   返回值 文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。

   附加说明 一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。

   范例

   #include<stdio.h>

    main()

    {

    FILE * fp;

    fp=fopen(“noexist”,”a+”);

    if(fp= =NULL) return;

    fclose(fp);

    }

   fputc(将一指定字符写入文件流中)

   相关函数 fopen,fwrite,fscanf,putc

   表头文件 #include<stdio.h>

   定义函数 int fputc(int c,FILE * stream);

   函数说明 fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中。

   返回值 fputc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。

   范例

   #include<stdio.h>

    main()

    {

    FILE * fp;

    char a[26]=”abcdefghijklmnopqrstuvwxyz”;

    int i;

    fp= fopen(“noexist”,”w”);

    for(i=0;i<26;i++)

    fputc(a,fp);

    fclose(fp);

    }

   fputs(将一指定的字符串写入文件内)

   相关函数 fopen,fwrite,fscanf,fputc,putc

   表头文件 #include<stdio.h>

   定义函数 int fputs(const char * s,FILE * stream);

   函数说明 fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。

   返回值 若成功则返回写出的字符个数,返回EOF则表示有错误发生。

   范例 请参考fgets()。

   fread(从文件流读取数据)

   相关函数 fopen,fwrite,fseek,fscanf

   表头文件 #include<stdio.h>

   定义函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

   函数说明 fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。

   返回值 返回实际读取到的nmemb数目。

   附加说明

   范例

   #include<stdio.h>

    #define nmemb 3

    struct test

    {

    char name[20];

    int size;

    }s[nmemb];

    int main(){

    FILE * stream;

    int i;

    stream = fopen(“/tmp/fwrite”,”r”);

    fread(s,sizeof(struct test),nmemb,stream);

    fclose(stream);

    for(i=0;i<nmemb;i++)

    printf(“name[%d]=%-20s:size[%d]=%d\n”,i,s.name,i,s.size);

    }

   执行

   name[0]=Linux! size[0]=6

   name[1]=FreeBSD! size[1]=8

   name[2]=Windows2000 size[2]=11

   freopen(打开文件)

   相关函数 fopen,fclose

   表头文件 #include<stdio.h>

   定义函数 FILE * freopen(const char * pathconst char * mode,FILE * stream);

   函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode请参考fopen()说明。参数stream为已打开的文件指针。Freopen()会将原stream所打开的文件流关闭,然后打开参数path的文件。

#include<stdio.h>

    main()

    {

    FILE * fp;

    fp=fopen(“/etc/passwd”,”r”);

    fp=freopen(“/etc/group”,”r”,fp);

    fclose(fp);

    }

   fseek(移动文件流的读写位置)

   相关函数 rewind,ftell,fgetpos,fsetpos,lseek

   表头文件 #include<stdio.h>

   定义函数 int fseek(FILE * stream,long offset,int whence);

   函数说明 fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。

   参数 whence为下列其中一种:

   SEEK_SET从距文件开头offset位移量为新的读写位置。SEEK_CUR 以目前的读写位置往后增加offset个位移量。

   SEEK_END将读写位置指向文件尾后再增加offset个位移量。

   当whence值为SEEK_CUR 或SEEK_END时,参数offset允许负值的出现。

   下列是较特别的使用方式:

   1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);

   2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,0SEEK_END);

   返回值 当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。

   附加说明 fseek()不像lseek()会返回读写位置,因此必须使用ftell()来取得目前读写的位置。

   范例

   #include<stdio.h>

    main()

    {

    FILE * stream;

    long offset;

    fpos_t pos;

    stream=fopen(“/etc/passwd”,”r”);

    fseek(stream,5,SEEK_SET);

    printf(“offset=%d\n”,ftell(stream));

    rewind(stream);

    fgetpos(stream,&pos);

    printf(“offset=%d\n”,pos);

    pos=10;

    fsetpos(stream,&pos);

    printf(“offset = %d\n”,ftell(stream));

    fclose(stream);

    }

   执行 offset = 5

   offset =0

   offset=10

   ftell(取得文件流的读取位置)

   相关函数 fseek,rewind,fgetpos,fsetpos

   表头文件 #include<stdio.h>

   定义函数 long ftell(FILE * stream);

   函数说明 ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。

   返回值 当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。

   错误代码 EBADF 参数stream无效或可移动读写位置的文件流。

   范例 参考fseek()。

   fwrite(将数据写至文件流)

   相关函数 fopen,fread,fseek,fscanf

   表头文件 #include<stdio.h>

   定义函数 size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);

   函数说明 fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr 指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。

   返回值 返回实际写入的nmemb数目。

   范例

   #include<stdio.h>

    #define set_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);}

    #define nmemb 3

    struct test

    {

    char name[20];

    int size;

    }s[nmemb];

    main()

    {

    FILE * stream;

    set_s(0,”Linux!”);

    set_s(1,”FreeBSD!”);

    set_s(2,”Windows2000.”);

    stream=fopen(“/tmp/fwrite”,”w”);

    fwrite(s,sizeof(struct test),nmemb,stream);

    fclose(stream);

    }

   执行 参考fread()。

   getc(由文件中读取一个字符)

   相关函数 read,fopen,fread,fgetc

   表头文件 #include<stdio.h>

   定义函数 int getc(FILE * stream);

   函数说明 getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。虽然getc()与fgetc()作用相同,但getc()为宏定义,非真正的函数调用。

   返回值 getc()会返回读取到的字符,若返回EOF则表示到了文件尾。

   范例 参考fgetc()。

   getchar(由标准输入设备内读进一字符)

   相关函数 fopen,fread,fscanf,getc

   表头文件 #include<stdio.h>

   定义函数 int getchar(void);

   函数说明 getchar()用来从标准输入设备中读取一个字符。然后将该字符从unsigned char转换成int后返回。

   返回值 getchar()会返回读取到的字符,若返回EOF则表示有错误发生。

   附加说明 getchar()非真正函数,而是getc(stdin)宏定义。

  范例

   #include<stdio.h>

    main()

    {

    FILE * fp;

    int c,i;

    for(i=0li<5;i++)

    {

    c=getchar();

    putchar(c);

    }

    }

   执行 1234 /*输入*/

   1234 /*输出*/

   gets(由标准输入设备内读进一字符串)

   相关函数 fopen,fread,fscanf,fgets

   表头文件 #include<stdio.h>

   定义函数 char * gets(char *s);

   函数说明 gets()用来从标准设备读入字符并存到参数s所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上NULL作为字符串结束。

   返回值 gets()若成功则返回s指针,返回NULL则表示有错误发生。

   附加说明 由于gets()无法知道字符串s的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题。建议使用fgets()取代。

   范例 参考fgets()

    mktemp(产生唯一的临时文件名)

   相关函数 tmpfile

   表头文件 #include<stdlib.h>

   定义函数 char * mktemp(char * template);

   函数说明 mktemp()用来产生唯一的临时文件名。参数template所指的文件名称字符串中最后六个字符必须是XXXXXX。产生后的文件名会借字符串指针返回。

   返回值 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

   附加说明 参数template所指的文件名称字符串必须声明为数组,如:

   char template[ ]=”template-XXXXXX”;

   不可用char * template=”template-XXXXXX”;

   范例

   #include<stdlib.h>

    main()

    {

    char template[ ]=”template-XXXXXX”;

    mktemp(template);

    printf(“template=%s\n”,template);

    }

   putc(将一指定字符写入文件中)

   相关函数 fopen,fwrite,fscanf,fputc

   表头文件 #include<stdio.h>

   定义函数 int putc(int c,FILE * stream);

   函数说明 putc()会将参数c转为unsigned char后写入参数stream指定的文件中。虽然putc()与fputc()作用相同,但putc()为宏定义,非真正的函数调用。

   返回值 putc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。

   范例 参考fputc()。

   putchar(将指定的字符写到标准输出设备)

   相关函数 fopen,fwrite,fscanf,fputc

   表头文件 #include<stdio.h>

   定义函数 int putchar (int c);

   函数说明 putchar()用来将参数c字符写到标准输出设备。

   返回值 putchar()会返回输出成功的字符,即参数c。若返回EOF则代表输出失败。

   附加说明 putchar()非真正函数,而是putc(c,stdout)宏定义。

   范例 参考getchar()。

   rewind(重设文件流的读写位置为文件开头)

   相关函数 fseek,ftell,fgetpos,fsetpos

   表头文件 #include<stdio.h>

   定义函数 void rewind(FILE * stream);

   函数说明 rewind()用来把文件流的读写位置移至文件开头。参数stream为已打开的文件指针。此函数相当于调用fseek(stream,0,SEEK_SET)。

   返回值

   范例 参考fseek()

   setbuf(设置文件流的缓冲区)

   相关函数 setbuffer,setlinebuf,setvbuf

   表头文件 #include<stdio.h>

   定义函数 void setbuf(FILE * stream,char * buf);

   函数说明 在打开文件流后,读取内容之前,调用setbuf()可以用来设置文件流的缓冲区。参数stream为指定的文件流,参数buf指向自定的缓冲区起始地址。如果参数buf为NULL指针,则为无缓冲IO。Setbuf()相当于调用:setvbuf(stream,buf,buf?_IOFBF:_IONBF,BUFSIZ)

   返回值

   setbuffer(设置文件流的缓冲区)

   相关函数 setlinebuf,setbuf,setvbuf

   表头文件 #include<stdio.h>

   定义函数 void setbuffer(FILE * stream,char * buf,size_t size);

   函数说明 在打开文件流后,读取内容之前,调用setbuffer()可用来设置文件流的缓冲区。

   参数stream为指定的文件流,参数buf指向自定的缓冲区起始地址,参数size为缓冲区大小。

   返回值

   setlinebuf(设置文件流为线性缓冲区)

   相关函数 setbuffer,setbuf,setvbuf

   表头文件 #include<stdio.h>

   定义函数 void setlinebuf(FILE * stream);

   函数说明 setlinebuf()用来设置文件流以换行为依据的无缓冲IO。相当于调用:setvbuf(stream,(char * )NULL,_IOLBF,0);请参考setvbuf()。

   返回值

   setvbuf(设置文件流的缓冲区)

   相关函数 setbuffer,setlinebuf,setbuf

表头文件 #include<stdio.h>

   定义函数 int setvbuf(FILE * stream,char * buf,int mode,size_t size);

   函数说明 在打开文件流后,读取内容之前,调用setvbuf()可以用来设置文件流的缓冲区。参数stream为指定的文件流,参数buf指向自定的缓冲区起始地址,参数size为缓冲区大小,参数mode有下列几种

   _IONBF 无缓冲IO

   _IOLBF 以换行为依据的无缓冲IO

   _IOFBF 完全无缓冲IO。如果参数buf为NULL指针,则为无缓冲IO。

   返回值

   ungetc(将指定字符写回文件流中)

   相关函数 fputc,getchar,getc

   表头文件 #include<stdio.h>

   定义函数 int ungetc(int c,FILE * stream);

   函数说明 ungetc()将参数c字符写回参数stream所指定的文件流。这个写回的字符会由下一个读取文件流的函数取得。

   返回值 成功则返回c 字符,若有错误则返回EOF。

 

abcdefg

一、标准文件的读写

      1.文件的打开fopen()

          文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头。

              fopen(char *filename,char *type);

          其中*filename是要打开文件的文件名指针,一般用双引号括起来的文件名表示,也可使用双反斜杠隔开的路径名。而*type参数表示了对打开文件的操作方式。其可采用的操作方式如下:

 

              方式                      含义

               "r"             打开,只读

               "w"             打开,文件指针指到头,只写

               "a"             打开,指向文件尾,在已存在文件中追加

               "rb"            打开一个二进制文件,只读

               "wb"            打开一个二进制文件,只写

               "ab"            打开一个二进制文件,进行追加

               "r+"            以读/写方式打开一个已存在的文件

               "w+"            以读/写方式建立一个新的文本文件

               "a+"            以读/写方式打开一个文件文件进行追加

               "rb+"           以读/写方式打开一个二进制文件

               "wb+"           以读/写方式建立一个新的二进制文件

       "rt+"    读写打开一个文本文件,允许读和写

              “wt+”    读写打开或建立一个文本文件,允许读写

               "ab+"           以读/写方式打开一个二进制文件进行追加

 

          当用fopen(0成功的打开一个文件时,该函数将返回一个FILE指针,如果文件打开失败,将返回一个NULL指针。如想打开test文件,进行写:

 

              FILE *fp;

              if((fp=fopen("test","w"))==NULL)

              {

                  printf("File cannot be    opened\n");

                  exit();

              }

              else

                  printf("File opened for writing\n");

                    ……

              fclose(fp);

 

          DOS操作系统对同时打开的文件数目是有限制的,缺省值为5,可以通过修改CONFIG.SYS文件改变这个设置。

 

      2.关闭文件函数fclose()

          文件操作完成后,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。

              int fclose(FILE *stream);

          它表示该函数将关闭FILE指针对应的文件,并返回一个整数值。若成功地关闭了文件,则返回一个0值,否则返回一个非0值。常用以下方法进行测试:

 

              if(fclose(fp)!=0)

              {

                  printf("File cannot be closed\n");

                  exit(1);

              }

              else

                  printf("File is now closed\n");

 

          当打开多个文件进行操作,而又要同时关闭时,可采用fcloseall()函数,它将关闭所有在程序中打开的文件。

              int fcloseall();

          该函数将关闭所有已打开的文件,将各文件缓冲区未装满的内容写到相应的文件中去,接着释放这些缓冲区,并返回关闭文件的数目。如关闭了4个文件,则当执行:

              n=fcloseall();

          时,n应为4。

      3.文件的读写

          (1).读写文件中字符的函数(一次只读写文件中的一个字符):

 

              int fgetc(FILE *stream);

              int fgetchar(void);

              int fputc(int ch,FILE *stream);

              int fputchar(int ch);

              int getc(FILE *stream);

              int putc(int ch,FILE *stream);

          其中fgetc()函数将把由流指针指向的文件中的一个字符读出,例如:

              ch=fgetc(fp);

          将把流指针fp指向的文件中的一个字符读出,并赋给ch,当执行fgetc()函数时,若当时文件指针指到文件尾,即遇到文件结束标志EOF(其对应值为-1),该函数返回一个-1给ch,在程序中常用检查该函数返回值是否为-1来判断是否已读到文件尾,从而决定是否继续。

 

              #include "stdio.h"

              main()

              {

                  FILE *fp;

                  ch ch;

                  if((fp=fopen("myfile.tex","r"))==NULL)

                  {

                      printf("file cannot be opened\n");

                      exit(1);

                  }

                  while((ch=fgetc(fp))!=EOF) fputc(ch,stdout);

                  fclose(fp);

              }

               

          该程序以只读方式打开myfile.txt文件,在执行while循环时,文件指针每循环一次后移一个字符位置。用fgetc()函数将文件指针指定的字符读到ch变量中,然后用fputc()函数在屏幕上显示,当读到文件结束标志EOF时,变关闭该文件。

          上面的程序用到了fputc()函数,该函数将字符变量ch的值写到流指针指定的文件中去,由于流指针用的是标准输出(显示器)的FILE指针stdout,故读出的字符将在显示器上显示。又比如:

              fputc(ch,fp);

          该函数执行结构,将把ch表示的字符送到流指针fp指向的文件中去。

              在TC中,putc()等价于fput(),getc()等价于fgetc()。

              putchar(c)相当于fputc(c,stdout);getchar()相当于fgetc(stdin)。

          注意,这里使用char ch,其实是不科学的,因为最后判断结束标志时,是看ch!=EOF,而EOF的值为-1,这显然和char是不能比较的。所以,某些使用,我们都定义成int ch。

          (2).读写文件中字符串的函数

               

              char *fgets(char *string,int n,FILE *stream);

              char *gets(char *s);

              int fprintf(FILE *stream,char *format,variable-list);

              int fputs(char *string,FILE *stream);

              int fscanf(FILE *stream,char *format,variable-list);

          其中fgets()函数将把由流指针指定的文件中n-1个字符,读到由指针stream指向的字符数组中去,例如:

              fgets(buffer,9,fp);

          将把fp指向的文件中的8个字符读到buffer内存区,buffer可以是定义的字符数组,也可以是动态分配的内存区。

          注意,fgets()函数读到'\n'就停止,而不管是否达到数目要求。同时在读取字符串的最后加上'\0'。

          fgets()函数执行完以后,返回一个指向该串的指针。如果读到文件尾或出错,则均返回一个空指针NULL,所以长用feof()函数来测定是否到了文件尾或者是ferror()函数来测试是否出错,例如下面的程序用fgets()函数读test.txt文件中的第一行并显示出来:

          

              #include "stdio.h"

              main()

              {

                  FILE *fp;

                  char str[128];

                  if((fp=fopen("test.txt","r"))==NULL)

                  {

                      printf("cannot open file\n");

                      exit(1);

                  }

                  while(!feof(fp))

                  {

                      if(fgets(str,128,fp)!=NULL) printf("%s",str);

                  }

                  fclose(fp);

              }

 

          gets()函数执行时,只要未遇到换行符或文件结束标志,将一直读下去。因此读到什么时候为止,需要用户进行控制,否则可能造成存储区的溢出。

          fputs()函数想指定文件写入一个由string指向的字符串,'\0'不写入文件。                

          fprintf()和fscanf()同printf()和scanf()函数类似,不同之处就是printf()函数是想显示器输出,fprintf()则是向流指针指向的文件输出;fscanf()是从文件输入。

 

          下面程序是向文件test.dat里输入一些字符:

 

              #include<stdio.h>

              main()

              {

                  char *s="That's good news";

                  int i=617;

                  FILE *fp;

                  fp=fopne("test.dat", "w");   

                  fputs("Your score of TOEFLis",fp);   

                  fputc(':', fp);                      

                  fprintf(fp, "%d\n", i);              

                  fprintf(fp, "%s", s);                

                  fclose(fp);

              }

              用DOS的TYPE命令显示TEST.DAT的内容如下所示:

              屏幕显示

                  Your score of TOEFL is: 617

                  That's good news

               

          下面的程序是把上面的文件test.dat里的内容在屏幕上显示出来:

       

              #include<stdio.h>

              main()

              {

                  char *s, m[20];

                  int i;

                  FILE    *fp;

                  fp=fopen("test.dat", "r");    

                  fgets(s, 24, fp);             

                  printf("%s", s);

                  fscanf(fp, "%d", &i);         

                  printf("%d", i);

                  putchar(fgetc(fp));           

                  fgets(m, 17, fp);             

                  puts(m);                      

                  fclose(fp);

                  getch();

              }

              运行后屏幕显示:

                  Your score of TOEFL is: 617

                  That's good news

 

      4.清除和设置文件缓冲区

          (1).清除文件缓冲区函数:

              int fflush(FILE *stream);

              int flushall();

               

              fflush()函数将清除由stream指向的文件缓冲区里的内容,常用于写完一些数据后,立即用该函数清除缓冲区,以免误操作时,破坏原来的数据。

              flushall()将清除所有打开文件所对应的文件缓冲区。

          (2).设置文件缓冲区函数

              void setbuf(FILE *stream,char *buf);

              void setvbuf(FILE *stream,char *buf,int type,unsigned size);

          这两个函数将使得打开文件后,用户可建立自己的文件缓冲区,而不使用fopen()函数打开文件设定的默认缓冲区。               

          对于setbuf()函数,buf指出的缓冲区长度由头文件stdio.h中定义的宏BUFSIZE的值决定,缺省值为512字节。当选定buf为空时,setbuf函数将使的文件I/O不带缓冲。而对setvbuf函数,则由malloc函数来分配缓冲区。参数size指明了缓冲区的长度(必须大于0),而参数type则表示了缓冲的类型,其值可以取如下值:

 

                  type 值             含义

                   _IOFBF        文件全部缓冲,即缓冲区装满后,才能对文件读写

                   _IOLBF        文件行缓冲,即缓冲区接收到一个换行符时,才能对文件读写

                   _IONBF        文件不缓冲,此时忽略buf,size的值,直接读写文件,不再经过文件缓冲区缓冲

 

      5.文件的随机读写函数

          前面介绍的文件的字符/字符串读写,均是进行文件的顺序读写,即总是从文件的开头开始进行读写。这显然不能满足我们的要求,C语言提供了移动文件指针和随机读写的函数,它们是:

          (1).移动文件指针函数:

              long ftell(FILE *stream);

              int rewind(FILE *stream);

              fseek(FILE *stream,long offset,int origin);

 

              函数ftell()用来得到文件指针离文件开头的偏移量。当返回值是-1时表示出错。

              rewind()函数用于文件指针移到文件的开头,当移动成功时,返回0,否则返回一个非0值。

              fseek()函数用于把文件指针以origin为起点移动offset个字节,其中origin指出的位置可有以下几种:

 

                 origin           数值             代表的具体位置

 

                SEEK_SET          0               文件开头

                SEEK_CUR          1               文件指针当前位置

                SEEK_END          2               文件尾

 

             例如:

                 fseek(fp,10L,0);

             把文件指针从文件开头移到第10字节处,由于offset参数要求是长整型数,故其数后带L。

                 fseek(fp,-15L,2);

             把文件指针从文件尾向前移动15字节。

 

         (2).文件随机读写函数

 

             int fread(void *ptr,int size,int nitems,FILE *stream);

             int fwrite(void *ptr,int size,int nitems,FILE *stream);

               

             fread()函数从流指针指定的文件中读取nitems个数据项,每个数据项的长度为size个字节,读取的nitems数据项存入由ptr指针指向的内存缓冲区中,

在执行fread()函数时,文件指针随着读取的字节数而向后移动,最后移动结束的位置等于实际读出的字节数。该函数执行结束后,将返回实际读出的数据项数,

这个数据项数不一定等于设置的nitems,因为若文件中没有足够的数据项,或读中间出错,都会导致返回的数据项数少于设置的nitems。当返回数不等于nitems时

,可以用feof()或ferror()函数进行检查。

 

             fwrite()函数从ptr指向的缓冲区中取出长度为size字节的nitems个数据项,写入到流指针stream指向的文件中,执行该操作后,文件指针将向后移动,

移动的字节数等于写入文件的字节数目。该函数操作完成后,也将返回写入的数据项数。

 

 

 

二、非标准文件的读写

      这类函数最早用于UNIX操作系统,ANSI标准未定义,但有时也经常用到,DOS 3.0以上版本支持这些函数。它们的头文件为io.h。

      由于我们不常用这些函数,所以在这里就简单说一下。

      1.文件的打开和关闭

          open()函数的作用是打开文件,其调用格式为:

              int open(char *filename, int access);

          该函数表示按access的要求打开名为filename的文件,返回值为文件描述字,其中access有两部分内容:

          基本模式和修饰符, 两者用" "("或")方式连接。修饰符可以有多个, 但基本模式只能有一个。

 

                           access的规定

              --------------------------------------------------------

              基本模式      含义      修饰符           含    义

              --------------------------------------------------------

              O_RDONLY      只读     O_APPEND     文件指针指向末尾

              O_WRONLY      只写     O_CREAT      文件不存在时创建文件, 属性按基本模式属性

              O_RDWR        读写     O_TRUNC      若文件存在, 将其长度缩为0, 属性不变

                                 O_BINARY     打开一个二进制文件

                                 O_TEXT       打开一个文字文件

              ---------------------------------------------------------

              open()函数打开成功, 返回值就是文件描述字的值(非负值), 否则返回-1。

              close()函数的作用是关闭由open()函数打开的文件, 其调用格式为:

                  int close(int handle);

              该函数关闭文件描述字handle相连的文件。

 

      2.读写函数

          int read(int handle, void *buf, int count);

          read()函数从handle(文件描述字)相连的文件中, 读取count个字节放到buf所指的缓冲区中,

      返回值为实际所读字节数, 返回-1表示出错。返回0 表示文件结束。

 

           write()函数的调用格式为:

               int write(int handle, void *buf, int count);

           write()函数把count个字节从buf指向的缓冲区写入与handle相连的文件中, 返回值为实际写入的字节数。

             

      3.随机定位函数

          lseek()函数的调用格式为:

               int lseek(int handle, long offset, int fromwhere);

          该函数对与handle相连的文件位置指针进行定位,功能和用法与fseek()函数相同。

 

          tell()函数的调用格式为:

               long tell(int handle);

          该函数返回与handle相连的文件现生位置指针, 功能和用法与ftell()相同

0 0