fseek函数一般用于二进制文件(fseek函数一般用在什么文件)

本文目录
fseek函数一般用在什么文件
fseek函数用于重定位流(数据流/文件)上的文件内部位置指针。
函数原型int fseek(FILE *stream, long offset, int fromwhere);
参数:
stream为文件流的指针
offset 偏移量
fromwhere 起始位置
具体功能:如果执行成功,stream将指向以fromwhere(起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
返回值:
成功,返回0,失败返回-1,并设置errno的值,可以用perror()函数输出错误。
实例:
#include 《stdio.h》
long filesize(FILE*stream);
int main(void)
{
FILE *stream;
stream=fopen(“MYFILE.TXT“,“w+“);
fprintf(stream,“This is a test“);
printf(“File size of MYFILE.TXT is %ld bytes\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;
}
C语言大文件操作疑问(fseek)
是有这个限制的。
如果使用的标准的c函数的。
如果是你是32操作系统,c语言操作文件的大小是 2^31 ,2G
如果是你是64操作系统,c语言操作文件的大小是.2^63 ,8589934592 G
。
你说的问题肯定,出在32位操作系统上。
一是:
操作系统能不能允许创建2G以上的文件了,具体要看操作系统了。
如果不允许,你的问题就没什么意义了!
如果操作系统允许的话,都会提供,系统函数让你调用的。
你得自己去找资料了。
===============
你可以看一下,sqlite的源代码,我的3-5-4版本
他不用是用c语言标准库的。函数,能windows提供的系统函数SetFilePointer,ReadFile
static int winRead(
sqlite3_file *id, /* File to read from */
void *pBuf, /* Write content into this buffer */
int amt, /* Number of bytes to read */
sqlite3_int64 offset /* Begin reading at this offset */
){
LONG upperBits = (offset》》32) & 0x7fffffff;
LONG lowerBits = offset & 0xffffffff;
DWORD rc;
DWORD got;
winFile *pFile = (winFile*)id;
assert( id!=0 );
SimulateIOError(return SQLITE_IOERR_READ);
OSTRACE3(“READ %d lock=%d\n“, pFile-》h, pFile-》locktype);
rc = SetFilePointer(pFile-》h, lowerBits, &upperBits, FILE_BEGIN);
if( rc==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR ){
return SQLITE_FULL;
}
if( !ReadFile(pFile-》h, pBuf, amt, &got, 0) ){
return SQLITE_IOERR_READ;
}
if( got==(DWORD)amt ){
return SQLITE_OK;
}else{
memset(&((char*)pBuf)[got], 0, amt-got);
return SQLITE_IOERR_SHORT_READ;
}
}
c语言文件操作的问题~~
文件定位
移动文件内部位置指针的函数主要有两个,即 rewind 函数和fseek函数。
rewind函数前面已多次使用过,其调用形式为:
rewind(文件指针);
它的功能是把文件内部的位置指针移到文件首。
下面主要介绍fseek函数。
fseek函数用来移动文件内部位置指针,其调用形式为:
fseek(文件指针,位移量,起始点);
其中:
“文件指针”指向被移动的文件。
“位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。
“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。
其表示方法如下表。
起始点 表示符号 数字表示
文件首 SEEK_SET 0
当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
例如:
fseek(fp,100L,0);
其意义是把位置指针移到离文件首100个字节处。
还要说明的是fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。
文件的随机读写
在移动位置指针之后,即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。
下面用例题来说明文件的随机读写。
【例】在学生文件stu_list中读出第二个学生的数据。
#include《stdio.h》
struct stu
{
char name;
int num;
int age;
char addr;
}boy,*qq;
main()
{
FILE *fp;
char ch;
int i=1;
qq=&boy
if((fp=fopen(“stu_list“,“rb“))==NULL)
{
printf(“Cannot open file strike any key exit!“);
getch();
exit(1);
}
rewind(fp);
fseek(fp,i*sizeof(struct stu),0);
fread(qq,sizeof(struct stu),1,fp);
printf(“\n\nname\tnumber age addr\n“);
printf(“%s\t%5d %7d %s\n“,qq-》name,qq-》num,qq-》age,
qq-》addr);
}
文件stu_list已建立,本程序用随机读出的方法读出第二个学生的数据。程序中定义boy为stu类型变量,qq为指向boy的指针。以读二进制文件方式打开文件,程序第22行移动文件位置指针。其中的i值为1,表示从文件头开始,移动一个stu类型的长度,然后再读出的数据即为第二个学生的数据。

更多文章:
html document对象(载入浏览器的html文档都会成为document的对象吗)
2026年9月21日 16:00
安装包怎样下载mysql(如何在官网上下载可安装版的MySQL数据库)
2026年9月21日 15:30
威廉尖叫音效在线(渴求《勇敢的心》的配乐a gift of a thistle下载)
2026年9月21日 15:20
wordpress建站教程视频(WordPress建站的基本流程)
2026年9月21日 14:00
powerquery(power query中文含义是什么)
2026年9月21日 11:50
reactnative文档扫描(为什么要学习React Native)
2026年9月21日 10:30
aptana studio 3 windows 10(aptana studio 3 怎么改成中文)
2026年9月21日 09:20





