fseek函数

int fseek(FILE *stream, long offset, int fromwhere);函数设置文件指针stream的位置。
如果执行成功,stream将指向以fromwhere为基准,偏移offset( 指针 偏移量)个字节的位置,函数返回0。如果执行失败( 比如offset超过文件自身大小),则不改变stream指向的位置,函数返回一个非0值。
实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,返回-1,且指向一个-1的位置,请小心使用。
fseek 函数和lseek函数类似,但lseek返回的是一个off_t数值,而fseek返回的是一个整型。
外文名
 fseek
类    型
函数
领    域
计算机
注    意
不是 定位文件指针

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的方法,这样可以达到较好的处理效果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值