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指向的位置。
扩展资料:
int fseek(FILE *stream, long offset, int fromwhere)
第一个参数file指针
第二个参数移动的偏移量
第三个参数移动到哪里
分别用3个宏
SEEK_SET 既0 文件开头
SEEK_CUR 既1 文件当前位置
SEEK_END 既2 文件结尾
但不推荐用数字 最好用宏
参考资料来源:百度百科-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
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)