详解C语言中fseek函数和ftell函数的使用方法
fseek函数:
intfseek(FILE*_File,long_Offset,int_Origin);
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变stream指向的位置,函数返回一个非0值。
超出文件末尾位置,还是返回0。往回偏移超出首位置,还是返回0,小心使用。
第一个参数stream为文件指针。
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移。
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、SEEK_END或SEEK_SET。
SEEK_SET:文件开头
SEEK_CUR:当前位置
SEEK_END:文件结尾
eg:
#include<stdio.h>
#defineN5
typedefstructstudent{
longsno;
charname[10];
floatscore[3];
}STU;
voidfun(char*filename,STUn)
{
FILE*fp;
fp=fopen(filename,"rb+");
fseek(fp,-1L*sizeof(STU),SEEK_END);
fwrite(&n,sizeof(STU),1,fp);
fclose(fp);
}
intmain()/*修改覆盖最后一个学生数据*/
{
STUt[N]={
{10001,"MaChao",91,92,77},
{10002,"CaoKai",75,60,88},
{10003,"LiSi",85,70,78},
{10004,"FangFang",90,82,87},
{10005,"ZhangSan",95,80,88}
};
STUn={10006,"ZhaoSi",55,70,68},ss[N];
inti,j;FILE*fp;
fp=fopen("student.dat","wb");
fwrite(t,sizeof(STU),N,fp);
fclose(fp);
fp=fopen("student.dat","rb");
fread(ss,sizeof(STU),N,fp);
fclose(fp);
printf("\nTheoriginaldata:\n\n");
for(j=0;j<N;j++)
{
printf("\nNo:%ldName:%-8sScores:",ss[j].sno,ss[j].name);
for(i=0;i<3;i++)
printf("%6.2f",ss[j].score[i]);
printf("\n");
}
fun("student.dat",n);
printf("\nThedataaftermodifing:\n\n");
fp=fopen("student.dat","rb");
fread(ss,sizeof(STU),N,fp);
fclose(fp);
for(j=0;j<N;j++)
{
printf("\nNo:%ldName:%-8sScores:",ss[j].sno,ss[j].name);
for(i=0;i<3;i++)
printf("%6.2f",ss[j].score[i]);
printf("\n");
}
return0;
}
ftell函数
ftell函数用于得到文件位置指针当前位置相对与文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。
longlen=ftell(fp)
eg1:
#include<stdio.h>
intmain(void)
{
FILE*stream;
stream=fopen("MYFILE.TXT","w+");
fprintf(stream,"Thisisatest");
printf("Thefilepointerisatbyte\
%ld\n",ftell(stream));
fclose(stream);
return(0);
}
eg2:
ftell一般用于读取文件的长度,下面补充一个例子,读取文本文件中的内容:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
FILE*fp;
intflen;
char*p;
/*以只读方式打开文件*/
if((fp=fopen("1.txt","r"))==NULL)
{
printf("\nfileopenerror\n");
exit(0);
}
fseek(fp,0L,SEEK_END);/*定位到文件末尾*/
flen=ftell(fp);/*得到文件大小*/
p=(char*)malloc(flen+1);/*根据文件大小动态分配内存空间*/
if(p==NULL)
{
fclose(fp);
return(0);
}
fseek(fp,0L,SEEK_SET);/*定位到文件开头*/
fread(p,flen,1,fp);/*一次性读取全部文件内容*/
p[flen]='\0';/*字符串结束标志*/
printf("%s",p);
fclose(fp);
free(p);
return(0);
}
程序改进
#include<stdio.h>
main()
{
FILE*myf;
longf1;/*此处将f1设置为long可以读取更长的文件*/
myf=fopen("1.txt","rb");
fseek(myf,0,SEEK_END);
f1=ftell(myf);
fclose(myf);
printf(“%d\n”,f1);
}