C语言大文件操作疑问(fseek)

在C语言中文件流指针转移函数fseek定义为fseek(FILE*stream,longoffset,intorigin);其中offset的类型是long.如果一个大文... 在C语言中文件流指针转移函数fseek定义为fseek(FILE *stream,long offset,int origin);其中offset的类型是long.如果一个大文件的长度超过了long的范围,假如现在要跳转到0x100000000的位置,应该怎么处理?
试过用循环了,不管用
难道在32位系统中想创建一个2G以上的文件是不可能的吗?在嵌入式数据库sqlite中支持到2TB,而其数据存储是单文件的,这种机制怎么样才能实现?
展开
 我来答 举报
百度网友52da584
2009-03-15
知道答主
回答量:27
采纳率:0%
帮助的人:23.6万
展开全部
是有这个限制的。
如果使用的标准的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;
}
}
匿名用户
2015-08-08
展开全部
  C语言fseek()函数:移动文件流的读写位置
  相关函数:rewind, ftell, fgetpos, fsetpos, lseek
  头文件:#include <stdio.h>

  定义函数:int fseek(FILE * stream, long offset, int whence);

  函数说明:

  fseek()用来移动文件流的读写位置.
  1、参数stream 为已打开的文件指针,
  2、参数offset 为根据参数whence 来移动读写位置的位移数。参数 whence 为下列其中一种:
  SEEK_SET 从距文件开头offset 位移量为新的读写位置. SEEK_CUR 以目前的读写位置往后增加offset 个位移量。
  SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或SEEK_END 时, 参数offset 允许负值的出现.
  下列是较特别的使用方式:

  1) 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
  2) 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, 0SEEK_END);
  返回值:当调用成功时则返回0, 若有错误则返回-1, errno 会存放错误代码.

  附加说明:fseek()不像lseek()会返回读写位置, 因此必须使用ftell()来取得目前读写的位置.
本回答被网友采纳
抢首赞 已赞过 已踩过<
你对这个回答的评价是?
评论 举报 收起
创作者zTO4gA6Hxj
2019-01-19 · TA获得超过3万个赞
知道大有可为答主
回答量:1.2万
采纳率:31%
帮助的人:865万
展开全部
严格意义来说,fseek是操作二进制文件的。
如果你是想从文件文件读取一行,建议及用fgets函数。
读取到数组,再提取数据a、b、c,然后扔掉d
4 已赞过 已踩过<
你对这个回答的评价是?
评论 举报 收起
fdxuwei
2009-03-15 · TA获得超过271个赞
知道小有建树答主
回答量:207
采纳率:0%
帮助的人:273万
展开全部
用循环,多执行几次fseek函数
抢首赞 已赞过 已踩过<
你对这个回答的评价是?
评论 举报 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式