1.fseek()函数:
函数模型:int fseek(FILE *stream, long offset, int fromwhere);
函数功能:在fopen()函数打开的文件中移动到任意字节处。
头文件:<stdio.h>
返回值:int类型 正常处理 fseek()返回值为0,出现错误返回-1(超出范围)
第一个参数 FILE 指针,第二个参数偏移量(offset)(long类型)表示从起始点移动的距离,第三个参数是起点模式。
|
模式 | 偏移量的起始点 |
---|---|
SEEK_SET | 文件开始处 |
SEEK_CUR | 当前位置 |
SEEK_END | 文件末尾 |
示例:(fp是文件指针)
fseek(fp,-10L,SEEK_END);//从文件结尾回退10个字节。
2.ftell()函数
函数模型:long ftell(FILE *stream);
函数功能:使用fseek函数后再调用函数ftell()就能非常容易地确定文件的当前位置。
头文件:<stdio.h>
返回值:long类型 返回的是当前的位置 文件的第一个字节到文件的开始处的距离是0 以此类推 。(因为ftell返回long型,根据long型的取值范围-231~231-1(-2147483648~2147483647),故对大于2.1G的文件进行操作时出错。当处理这种大文件时通常用fgetpos()和fsetpos()函数)
#include<stdio.h>
int main()
{
long last;
char c;
FILE *fl=fopen("test.txt","r");
fseek(fl,0L,SEEK_END);
last=ftell(fl);
c=getc(fl);
printf("文本一共有%d个字符\n",last);
printf("seek_end定位到的最后一个字符是%chere\n",c);
return 0;
}
test.txt
!flesruoy eveileB ~elbissopmi si gnihtoN
运行结果:
文本一共有40个字符
seek_end定位到的最后一个字符是here
‘------------------------------------------------------------’
即fseek()函数定位到最后一个字符的后面
而恰好ftell()函数返回的距离满足文件的第一个字节到文件的开始处的距离是0
因此恰好可以得到文件中的准确字符数
补充:(摘自c primer plus 第六版)
MS-DOS编译器通常用Ctrl+Z标记文本文件的结尾,打开这样的文件时,c可以识别到这个字符,但是以二进制模式打开相同的字符,Ctrl+Z被看作文件中的一个字符,而实际的文件结尾符在该字符的后面,可能紧贴Ctrl+Z,或用空字符填充,使得该文件的大小是256得倍数
#include<stdio.h>
int main()
{
long last; \\字符数
char ch; \\储存字符
int count=1; \\从最后回退
FILE *fl=fopen("test.txt","r");
fseek(fl,0L,SEEK_END); \\定位最后位置
last=ftell(fl); \\得到字符数
for(;count<=last;count++)
{
fseek(fl,-count,SEEK_END);
ch=getc(fl);
printf("%c",ch);
}
return 0;
}
test.txt
!flesruoy eveileB ~elbissopmi si gnihtoN
运行结果:
Nothing is impossible~ Believe yourself!
由于标准IO的特性,每次调用函数读取文件的一个字符的时候,文件结构中文件位置指示器被设置为指向下一个待读取的字符。
//初学c语言 每天进步一点点~~