Fly With My Heart

誓言无声,人生无悔。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
C语言中对文件的随机存取
  C语言中要实现对文件的随机存取,需要用到两个函数fseek()、ftell()。下面通过一个反转显示指定文件的程序来介绍这两个函数的用法。
  reserve.c:
  
  #include <stdio.h>
  #include <stdlib.h>
  #define CNTL_Z '\032' //DOS 文本中的文件结尾标记
  #define SLEN 50
  int main(int argc, char *argv[])
  {
   char file[SLEN];
   char ch;
   FILE *fp;
   long count, last;
  
   puts("Enter the name of the file to be processed: ");
   gets(file);
   if( (fp = fopen(file, "rb")) == NULL ) //只读和二进制模式
   {
   printf("reverse can't open %s\n", file);
   exit(1);
   }
  
   fseek(fp, 0L, SEEK_SET); //定位在文件开头处
   last = ftell(fp);
   printf("fseek(fp, 0L, SEEK_SET) , fteel(p): %d\n", last);
  
   fseek(fp, 0L, SEEK_END); //定位在文件结尾处
   last = ftell(fp);
   printf("fseek(fp, 0L, SEEK_END) , fteel(p): %d\n", last);
  
   for(count = 1L; count <= last; count++)
   {
   fseek(fp, -count, SEEK_END);
   ch = getc(fp);
  
   if(ch != CNTL_Z && ch != '\r')
   {
   putchar(ch);
   }
   }
   putchar('\n');
   fclose(fp);
  
   system("PAUSE");
   return 0;
  }
  假定一个文件test.txt内容为:
  
  1234567890
  1234567890
  1234567890
  1111111112
  2222222223
  3333333334
  执行reserve来进行反转显示:
  
  Enter the name of the file to be processed:
  test.txt
  fseek(fp, 0L, SEEK_SET) , fteel(p): 0
  fseek(fp, 0L, SEEK_END) , fteel(p): 72
  4333333333
  3222222222
  2111111111
  0987654321
  0987654321
  0987654321
  下面,我们来解释一下fseek()和ftell()是如何工作的。
  l fseek()函数
  
  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()来取得目前读写的位置。
  l ftell()函数
  
  ftell(取得文件流的读取位置)
  相关函数
  fseek,rewind,fgetpos,fsetpos
  表头文件
  #include<stdio.h>
  定义函数
  long ftell(FILE * stream);
  函数说明
  ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。
  返回值
  当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。
  错误代码
  EBADF 参数stream无效或可移动读写位置的文件流。
  范例
  参考fseek()。
  通过fseek()、ftell()两个函数,我们就可以随意访问文件的任何位置了,想了想好像操作文件就这么easy,实在也没有更多可说的了。对了,fseek()和ftell()存在一个潜在的问题就是他们限制文件的大小只能在long类型的表示范围以内,也就是说通过这种方式,只能打开2,000,000,000字节的文件,不过在绝大多数情况下似乎也已经够用了。如果需要打开更大的文件,你需要用到fgetpos()、fsetpos()函数了,那是另一个命题了。


fseek函数是 用来设定文件的当前读写位置.

函数原型:   int fseek(FILE *fp,long offset,int origin);

函数功能:把fp的文件读写位置指针移到指定的位置.

fseek(fp,20,SEEK_SET); 意思是把fp文件读写位置指针从文件开始后移20个字节.

ftell函数是用来获取文件的当前读写位置;

函数原型: long ftell(FILE *fp)

函数功能:得到流式文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数.

ban=ftell(fp);  是获取fp指定的文件的当前读写位置,并将其值传给变量ban.

fseek函数与ftell函数综合应用:

分析:可以用fseek函数把位置指针移到文件尾,再用ftell函数获得这时位置指针距文件头的字节数,这个字节数就是文件的长度.

#include <stdio.h>

main()

{

   FILE *fp;

   char filename[80];

   long length;

   printf("输入文件名:");

   gets(filename);

   //以二进制读文件方式打开文件

   fp=fopen(filename,"rb");

   if(fp==NULL)

      printf("file not found!\n");

   else

      {

         //把文件的位置指针移到文件尾

          fseek(fp,OL,SEEK_END);

         //获取文件长度;

          length=ftell(fp);

          printf("该文件的长度为%1d字节\n",length);

          fclose(fp);

      }

}


#include   <stdio.h>  
   
  #include   <stdlib.h>  
   
   
   
  void   main()  
   
  {  
   
  FILE   *fp;  
   
  long   int   size;  
   
  char   *   buff;  
   
   
   
  if   ((fp=fopen("w.dat","rb"))==NULL)   {  
   
  printf("cannot   open   file\n");  
   
  exit(1);  
   
  }  
   
   
  fseek(fp,0,SEEK_END);  
  size=ftell(fp);  
  buff=(char   *)   malloc(size);  
  fseek(fp,0,SEEK_SET);  
   
   
   
   
  if   (fread(buff,1,size,fp)!=size)   {  
   
  printf("read   error!!");  
   
  }  
   
  free(buff);  
   
   
   
  }  

posted on 2008-03-30 10:30  FlyWithMyHeart  阅读(5683)  评论(0编辑  收藏  举报