ftell等重定位流相关函数

说明:本文主要是对man 帮助命令的翻译,若有错误,欢迎指正

fengjingtu

在上一篇博客中我们介绍了fseek函数,fseek函数可以将一个打开的文件的指示符重新定位到你想定位的位置。使用SEEK_SET,SEEK_CUR,SEEK_END,作为相对位置,相距n个字节,n是long型。本片文章,继续讲述与fseek相关的其他几个函数:ftell,rewind,fgetpos,fsetpos。


ftell

定义

1
2
3
#include <stdio.h>

long ftell(FILE *stream);

说明

ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。(2.1G以上的文件操作时可能出错。)


调用失败时返回-1,如果stream=NULL会引发程序中断。

我们可以使用ftell获得文件的大小。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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;
}
}
1
2
3
运行结果:
pos=3
pos=1848

在windows中查看test.txt的文件属性,发现大小也是1848字节。

test.txt

rewind

定义

1
2
3
#include <stdio.h>

void rewind(FILE *stream);

说明

rewind()函数用于将文件指针重新指向文件的开头,同时清除和文件流相关的错误和标记

相当于调用fseek(stream, 0, SEEK_SET)


示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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;
}
}
1
2
3
运行结果:
pos=3
pos=0

fgetpos 和 fsetpos

定义

1
2
3
#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的内容:

1
123

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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
2
3
4
运行结果:
1
1
2

关于ftell,rewind,fgetpos,fsetpos你了解了吗,自己验证一下吧^_^