目录
1功 能
2用 法
int fseek(FILE *stream, long offset, int fromwhere);
3描 述
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:
文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(
指针
偏移量)个字节的位置。如果执行失败(
比如offset超过文件自身大小),则不改变stream指向的位置。
fseek
函数和lseek函数类似,但lseek返回的是一个off_t数值,而fseek返回的是一个整型。
4返回值
成功,返回0,失败返回-1,并设置errno的值,可以用perror()函数输出错误。
fseek position the file(文件) position(位置) pointer(
指针) for the file referenced by stream to the byte location calculated by offset.
5程序例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <stdio.h>
long
filesize(
FILE
*stream);
int
main(
void
)
{
FILE
*stream;
stream=
fopen
(
"MYFILE.TXT"
,
"w+"
);
fprintf
(stream,
"Thisisatest"
);
printf
(
"FilesizeofMYFILE.TXTis%ldbytes\n"
,filesize(stream));
fclose
(stream);
return
0;
}
long
filesize(
FILE
*stream)
{
long
curpos,length;
curpos=
ftell
(stream);
fseek
(stream,0L,SEEK_END);
length=
ftell
(stream);
fseek
(stream,curpos,SEEK_SET);
return
length;
}
|
int fseek( FILE *stream, long offset, int origin );
第一个参数stream为文件
指针
第二个参数offset为
偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
简言之:
fseek(fp,100L,0);把文件内部
指针移动到离文件开头100字节处;
fseek(fp,100L,1);把文件内部
指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把文件内部
指针退回到离文件结尾100字节处。
使用实例:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#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);
}
voidmain()
/*修改覆盖最后一个学生数据*/
{
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"
);
}
}
|
6注意事项
fseek函数的
文件指针,应该为已经打开的文件。如果没有打开的文件,那么将会出现错误。 fseek函数也可以这样理解,相当于在文件当中定位。这样在读取规律性
存储文件时可以
利用其OFFSET
偏移量读取文件上任意的内容。
fseek函数一般用于二进制文件,也可以用于文本文件。用于文本文件操作时,需特别注意回车换行的情况:因为在一般浏览工具如UltraEdit中,回车换行视为两个字符0x0D和0x0A,但真实的文件读写和定位时却按照一个字符0x0A进行处理,因此碰到此类问题时,可以考虑将文件整个读入
内存,然后在内存中手工插入0x0D的方法,这样可以达到较好的处理效果。