文件操作小结(C语言版)

来源:互联网 发布:三星clx3305清零软件 编辑:程序博客网 时间:2024/06/06 15:19
1.文件打开——fopen()
   原型:FILE * fopen(const char*filename, const char*mode);
   功能:打开以filename所指向的字符串为文件名的文件,使之与一个流关联。
   返回值:打开成功,返回一个指向FILE类型结构变量,即文件指针,否则返回NULL
   所在头文件:stdio.h
   实例:
    FILE * fptr;
    if(fptr=fopen("client.dat","r+")==NULL)
       printf("File could not be opened.\n");
    else
    {  
          //相关的文件操作。
     }

    注意:  从ASCII文件读取数据到内存时,系统自动将回车换行符转换成一个换行符;在输出内存数据到ASCII文件时,将换行符转换成回车和换行两个字符。\n:回车换行,0D:回车, 0A:换行

2.文件打开的方式:

    r —— 文件必须存在,只读的方式打开一个ASCII文件

    w —— 如果文件存在,以只写的方式打开一个ASCII文件,原文件内容全部删除;如果文件不存在,则新建。

    a —— 如果文件存在,则打开一个把数据追加ASCII文件末尾;如果文件不存在,则新建。

    r+ —— 文件必须存在,以即可读又可写(更新数据)的方式打开一个ASCII文件

    w+ —— 如果文件存在,以即可读又可写(更新数据)的方式打开一个ASCII文件原文件内容全部删除;如果文件不存在,则新建。

    a+ ——  如果文件存在,则以即可读又可写打开一个把数据追加ASCII文件末尾;如果文件不存在,则新建。

   rb/wb/ab/r+b/w+b/a+b —— 对二进制文件的操作,其含义同ASCII文件操作。 

3.文件关闭——fclose()
   原型:int fclose(FILE * stream);
   功能:关闭文件指针stream所指向的文件,将所有未回写缓冲的数据写入文件,断开文件和流的关联,释放文件占用的资源,如缓冲区,FILE类型记录占用的内存等。
   返回值:如果正常关闭文件则返回0,否则返回EOF。
   所在头文件:stdio.h
   实例:

   fclose(fptr);



3.文件定位
    所在头文件:stdio.h
(1)位置指针复位函数——rewind()
    原型:void rewind(FILE*stream);
    功能:把文件位置指针重新定位到文件起始位置(即0字节处)
    返回值:无
(2)随机读写文件——fseek()
    原型:int fseek(FILE*stream, 位移量, 参照点);
    功能:将指定文件的位置指针,从参照点开始,移动指定的位移量
              i)参照点:SEEK_SET 值为0,表示文件头;SEEK_CUR 值为1,表示当前位置;
                             SEEK_END 值为2,表示文件尾。
              ii)位移量:以参照点为起点,向前(位移量>0)或向后(位移量<0)移动的字节数。
    实例:
     fseek(fptr,10,SEEK_SET); //从文件头(0字节处)向后移动10字节(10字节处)
(3)返回文件当前位置的函数——ftell()    
    原型:long  ftell(FILE *stream);    
    功能:返回文件位置指针的当前位置
    返回:返回文件位置指针的当前位置,即用相对于文件头的位移量表示。如果返回值为-1L,则表明调用出错。
    实例:
      offset=ftell(fp);
          
      if(offset= =-1L)
               
         printf(“ftell() error\n”);
      else
     {  
          //相关的文件操作。
      }


4.文件的读写操作

   所在头文件:stdio.h

(1)将一个字符写入指定文件——fputc()
    原型:int fputc(int c, FILE *stream)
    功能:将c所指定字符写入stream所指向的输出流中,文件位置指针向前移动一个字节。
    返回值:返回输出的字符数据;否则,返回一个符号常量EOF(其值在stdio.h中定义为-1)
    实例:
     fputc('A', fptr);  //在fptr处写入'A',文件位置指针后移1个字节
     fputc(c,stdout);  //定价于putchar(c);
(2)从指定文件读取一个字符——fgetc()
    原型:char fgetc(FILE * stream);
    功能:从stream所指向的输入流获取下一个unsigned char类型的字符并转换成int类型,同时将文件位置指针向前移动1个字节。
    返回值:返回读取的字符,如果到文件尾,设置该流的文件结束指示符并返回EOF;读错则设置该流的错误指示符并返回EOF。
    实例:
     ch=fgetc(fptr);  //从fptr读取一字符到ch中,同时将fptr的文件位置指针向前移动到下一个字符
     c=fgetc(stdin);  //定价于c=getchar();
(3)向文本文件输出一个字符串——fputs()
    原型:int fputs(const char* s, FILE *stream);
    功能:将s所指向的字符串写入stream所指向的流中(‘\0’不被写入)。同时将文件位置指针向前移动字符串长度个字节,指向下一写入位置。
    返回值:如果发生写错误,则函数返回EOF;否则,返回一个非负值。
    实例:
     fputs("Hello world!", fptr); //在当前文件指针位置写入Hello world!
     fputs(s, stdout);  //定价于puts(s);
(4)从文本文件读一个字符串——fgets()
    原型:char * fgets(char * s, int n, FILE *stream);

    功能:从stream指向的流中读取最多n-1个字符并放到s所指向的数组中,遇到下面情况不再往后读:

               i)读到新行符‘\n’或者文件结束符,但写入s所指向的数组中;

               ii)或虽未遇新行符和文件结束符、但已读入n-1个字符。最后一个字符读入数组后接着写入结束标志‘\0’ ,并将文件位置指针向前移动n-1(字符串长度)个字节。

              如果遇到文件结束符并且没有字符读入数组,则数组内容不变。键盘输入时,以CTRL+Z作为结束字符。
    返回值:如果成功返回值等于获得的字符串的首地址。 如果出错,或者读到FILE的结尾,返回NULL.
    实例:
     char s[100];
     fgets(s,100,fptr);   //假设文件足够长,实际上s中只有99个字符,最后一个位置为结束标志'\0' 
     fgets(s,sizeof(s),stdin);  //定价于gets(s);
(5)对文件格式化读——fscanf()
     原型:int fscanf(FILE * stream, const char * format, 输入变量首地址表)
     功能:函数从stream指向的标准输入流中读取字符序列,按照format中的格式规格说明对字符序列进行解释,并把结果存储在变量中。从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
     返回值:当能正常读入数据时, fscanf 返回读入数据的个数,否则返回 EOF 。
     实例:
      fscanf(fptr, "%d,%f", &i,&f);
      fscanf(stdin, "%d,%f", &i,&f);  //等价于scanf("%d,%f", &i,&f);
(6)对文件格式化写——fprintf()
     原型:int fprintf(FILE * stream, const char * format,输出参量表);
     功能:函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件. 
     返回值: fprintf()的返回值是输出的字符数,发生错误时返回一个EOF.
     实例:
      int i = 3;  float f = 9.80;

      fprintf(fptr, "%2d, %6.2f", i, f);    //将变量i按%2d格式、变量f按%6.2f格式, 以逗号作分隔符,输出到fPtr所指向的文件中:□3,□□9.80(□表示1个空格)

     fprintf(stdout, "%2d, %6.2f", i, f);   //等价于printf("%2d, %6.2f", i, f);

(7)在二进制文件读一数据块——fread()
     原型:int fread(void * buffer, int size, int count, FILE * stream);
     功能:从stream所指向的流中读取数据到buffer所指向的数组中, size表示单个数组元素的大小,最多读取count个数组元素,流的文件位置指针根据成功写入的字节数递增。
     返回值: 函数返回成功读入的元素个数。如果发生读错误,则返回值可能小于count。
     实例:
      struct student stu[3], astu;
      fread(stu, sizeof(struct student), 3, fptr);   // 从文件读取3条记录写入数组stu中
      fread(astu, sizeof(struct student), 1, fptr);  //一条记录写入结构变量aStu中
      fread(&ch, sizeof(char), 1, fptr);  //读取一个字节写入字符变量ch中
(8)在二进制文件写一数据块——fwrite()
     原型:int fwirte(void * buffer, int size, int count, FILE * stream)
     功能:将buffer所指向的数组内容写入stream所指向的流中。size表示单个数组元素大小,最多写入count个数组元素,流的文件位置指针根据成功写入的字节数递增。
     返回值:函数返回成功写入的元素个数,如果遇到错误,返回值可能小于count
     实例:
      struct student stu[3], astu;
      fwrite(stu, sizeof(struct student), 3, fptr);  //把数组stu中所有元素一次性写入文件
      fwrite(&astu, sizeof(struct student), 1, fptr);  //把变量astu中的内容写入文件

      fweite(ch, sizeof(ch), 1, fptr);  //把字符变量写入文件



    5.判断文件是否读到文件尾
(1)ASCII码文件:在对ASCII码文件执行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志EOF(其值在头文件stdio.h中被定义为-1)。(见fgetc(), fgets()定义)   
    实例:
      ch=fgetc(stdin);
      while(ch!=EOF)
     {
          fputc(ch,fptr);
          ch=fgetc(stdin);
      }
(2)判断是否读到文件末尾——feof()
    原型:int feof(FILE * stream);
    功能:判断文件是否读到文件尾,适用于ASCII码文件和二进制文件
    返回值:如果到文件尾,则返回1;否则返回0.
    实例:
     FILE * sfptr = NULL, dfptr = NULL;
     if((sfptr=fopen("input.txt","r"))!=NULL)
     {
        if((dfptr=fopen("output.txt","w"))!=NULL)
          {
             ch = fgetc(sfptr); //从input.txt文件读取一个字符
             while(!feof(sfptr)) //逐字符复制
            {
                 fputc(ch, dfptr);
                 ch = fgetc(sfptr);
            }
            fclose(dfptr);
          }
          fclose(sfptr);
     }
 注意:feof(fptr)!=EOF是无法判断是否读到 文件末尾的!是错误的写法。 
0 0
原创粉丝点击