说明:本文主要是对man 帮助命令的翻译,若有错误,欢迎指正
在上一篇博客中我们介绍了fseek函数,fseek函数可以将一个打开的文件的指示符重新定位到你想定位的位置。使用SEEK_SET,SEEK_CUR,SEEK_END,作为相对位置,相距n个字节,n是long型。本片文章,继续讲述与fseek相关的其他几个函数:ftell,rewind,fgetpos,fsetpos。
ftell
定义
#include <stdio.h>
long ftell(FILE *stream);
说明
ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。(2.1G以上的文件操作时可能出错。)
调用失败时返回-1,如果stream=NULL会引发程序中断。
我们可以使用ftell获得文件的大小。
示例
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int rtn=-1;
long pos=0;
FILE * fp=NULL;
// pos=ftell(fp); //程序会中断
fp = fopen("test.txt", "r+");
if(fp == NULL)
{
printf("file unreable\n");
return -1;
}
else
{
fseek(fp,3L, SEEK_SET);//重定位到文件开头后3个字节处,验证ftell功能
pos=ftell(fp);
printf("pos=%ld\n",pos);
rtn=fseek(fp,0, SEEK_END);//重定位到文件末尾,查看文件字节数。
pos=ftell(fp);
printf("pos=%ld\n",pos);
fclose(fp);
return 0;
}
}
运行结果:
pos=3
pos=1848
在windows中查看test.txt的文件属性,发现大小也是1848字节。
rewind
定义
#include <stdio.h>
void rewind(FILE *stream);
说明
rewind()函数用于将文件指针重新指向文件的开头,同时清除和文件流相关的错误和标记
相当于调用fseek(stream, 0, SEEK_SET)
示例
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int rtn=-1;
long pos=0;
FILE * fp=NULL;
fp = fopen("test.txt", "r+");
if(fp == NULL)
{
printf("file unreable\n");
return -1;
}
else
{
fseek(fp,3L, SEEK_SET);//重定位到文件开头后3个字节处
pos=ftell(fp);
printf("pos=%ld\n",pos);
rewind(fp);//重定位到文件开头
pos=ftell(fp);
printf("pos=%ld\n",pos);
fclose(fp);
return 0;
}
}
运行结果:
pos=3
pos=0
fgetpos 和 fsetpos
定义
#include <stdio.h>
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);
说明
fgetpos()函数和 ftell()类似,他只是把返回的指示符位置保存到 pos 中。
fsetpos函数功能上和fseek类似,根据 * pos中的值设置当前文件位置,它必须是前面在同一个流上的调用fgetpos所返回的一个值。
如果调用成功,这个函数返回0。
如果遇到了错误,它返回一个非零值,并在errno中存储一个因编译器而异的正值。
getpos和fsetpos函数是标准C新增的。
增加他们的目的是为了处理那些因为过于庞大而无法由long int类型的整数来定位的文件,在一些非UNIX系统中,一个 fpos_t 对象可能是一个复杂的对象。
示例
test.txt的内容:
123
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
FILE * fp=NULL;
fpos_t pos;
fpos_t pos2;
fp = fopen("test.txt", "r+");
if(fp == NULL)
{
printf("file unreable\n");
return -1;
}
else
{
fgetpos(fp,&pos);//刚开始指示符在文件开头,pos定位在文件开头
printf("%c\n",fgetc(fp));//fgetc是指示符移动一个字节
fgetpos(fp,&pos2);//pos2定位在文件第一个字节处
fsetpos(fp,&pos);//把指示符定位到pos指向的位置:文件开头。
printf("%c\n",fgetc(fp));
fsetpos(fp,&pos2);//把指示符定位到pos2指向的位置:文件第一个字节处。
printf("%c\n",fgetc(fp));
fclose(fp);
return 0;
}
}
运行结果:
1
1
2
关于ftell,rewind,fgetpos,fsetpos你了解了吗,自己验证一下吧_