社区
C语言
帖子详情
对int fseek( FILE *stream, long offset, int origin );当offset>4G时,怎么处理?
liuty2006
2004-06-08 04:05:22
int fseek( FILE *stream, long offset, int origin );
当offset>4G时,怎么处理?
...全文
363
23
打赏
收藏
对int fseek( FILE *stream, long offset, int origin );当offset>4G时,怎么处理?
int fseek( FILE *stream, long offset, int origin ); 当offset>4G时,怎么处理?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sharkhuang
2004-06-09
打赏
举报
回复
4G大于了32位机器的表示范围.所以我觉得可能fseek()这样的标准POSIX的函数不能达到这样的效果.
所以需要支持大文件的文件系统提供专门的api吧
liuty2006
2004-06-09
打赏
举报
回复
试过,不行:(
laomai
2004-06-09
打赏
举报
回复
在循环的前面加一句
fseek(fp,baseval,SEEK_SET); 试试
liuty2006
2004-06-09
打赏
举报
回复
kaphoon(齐柏林飞艇) :
你的意思是写汇编代码?
liuty2006
2004-06-09
打赏
举报
回复
试了一下,好像不行 :(
文件指针没有因循环而移动。
也就是说:
for(i=1,i<2;i++)
fseek(fp,baseval,SEEK_CUR);
与
fseek(fp,baseval,SEEK_CUR);
效果一样!!
怎么回事??
kaphoon
2004-06-09
打赏
举报
回复
调用该函数可以得到文件的大小,其值通过eax传送,如果文件的长度超过4G,那么文件长度DWORD的高值部分(也即超过4G的部分)保存在FileSizeHighWord中。因为我们估计一般的文件将没有这么大,故忽略该值。
http://www.ddvip.net/program/masm/13.htm
xiaonian_3654
2004-06-09
打赏
举报
回复
楼上,不是什么都能看到原码的
heuristic
2004-06-09
打赏
举报
回复
应该看一下fseek 源代码,看看是怎么实现的
双杯献酒
2004-06-09
打赏
举报
回复
使用
__int64 _lseeki64( int handle, __int64 offset, int origin );
baojian88888
2004-06-09
打赏
举报
回复
你不用 fseek 函数,而用 win32 的 api 函数
DWORD SetFilePointer(
HANDLE hFile, // handle to file
LONG lDistanceToMove, // bytes to move pointer
PLONG lpDistanceToMoveHigh, // bytes to move pointer
DWORD dwMoveMethod // starting point
);
试试?
xiaonian_3654
2004-06-09
打赏
举报
回复
非也,_lseek就行了,用python吧,这些烦人的事情就没有,支持大文件,
Wolf0403
2004-06-09
打赏
举报
回复
fseek 不知道。。。猜测一下在 Win32 平台,对于 4G 之后的内容,可以用 FileMapping 来读取。MapViewOfFile 的 offset 要求的是两个 DWORD,分别是 high val 和 low val,所以可以表示超过 4G 的范围。
comet007
2004-06-08
打赏
举报
回复
呵呵,终于看到有人讲对话了,呵呵!
lbaby
2004-06-08
打赏
举报
回复
晕
,这个与文件系统和操作系统有关
需要有与系统相关的api
leonchew
2004-06-08
打赏
举报
回复
我也想知道..这个大文件
junnyfeng
2004-06-08
打赏
举报
回复
你可能不知道int fseek( FILE *stream, long offset, SEEK_CUR );这个的意思
举个例子,设offset=1024,那就是1k
int fseek( FILE *stream, long offset, SEEK_SET );
后到达文件中从头开始1k的位置
int fseek( FILE *stream, long offset, SEEK_CUR );
就是从这1k的位置开始再搜索到下个1k的位置,这个就是从文件头开始2k的位置
如此适数调用上式,就可以追到文件任意位置
另外
我只想知道这么大的文件哪里可以看到??
liuty2006
2004-06-08
打赏
举报
回复
是NTFS系统
leonchew
2004-06-08
打赏
举报
回复
//没试过。有个思路,你试试看,不一定行。
double find_offset;//大于4G的数,假设以知
long int baseval=0x7ffffff;//给定基值,即最大的offset
double base_val=(double)baseval; //转换成double型
long int multiple=0;//倍数
long int residue=0; //余数
while( find_offset >= base_val ) { //得到倍数 和 余数
multiple++; //即:find_offset = multiple* base_val+ residue
find_offset=find_offset-base_val;
}
residue=(long)multiple;
//用fseek(fp,baseval,SEEK_CUR ) 滤去前multiple个数据
....
for(i=1,i<multiple;i++)
fseek(fp,baseval,SEEK_CUR); //SEEK_CUR,当前位置开始
fseek(fp,residue,SEEK_CUR) //到指定数据,可以读取了
....
liuty2006
2004-06-08
打赏
举报
回复
如果文件位置:15G的位置
关键是如何表示:>4G的数值?
unsigned long ulValue ?? 恐怕不行 ;(
junnyfeng
2004-06-08
打赏
举报
回复
to liuty2006,你的是ntfs系统吗?
用int fseek( FILE *stream, long offset, SEEK_SET );
再适当次数调用 int fseek( FILE *stream, long offset, SEEK_CUR );
以达到你要访问的位置
加载更多回复(3)
fseek
函数的用法:将文件指针定位到指定的位置
fseek
函数用于在文件中定位指针的位置。 函数原型:
int
fseek
(
FILE
*
stream
,
long
int
offset
,
int
origin
); 参数说明: -
stream
:指向
FILE
对象的指针,该对象是要进行操作的文件流。 -
offset
:偏移量,可以是正数或负数,表示指针要移动的字节数。 -
origin
:指定偏移量是相对于文件头、当前位置还是文件尾。可选值如下:
c语言获取文件大小的示例
1.
fseek
函数原型: 代码如下:
int
fseek
(
FILE
*
stream
,
long
int
offset
,
int
origin
); 参数说明:
stream
,文件流指针;offest,偏移量;orgin,原(始位置。其中orgin的可选值有SEEK_SET(文件开始)、SEEK_CUR(文件指针当前位置)、SEEK_END(文件结尾)。 函数说明:对于二进制模式打开的流,新的流位置是
origin
+
offset
。 2.ftell 函数原型:
long
int
ftell (
FILE
*
stream
); 函数说明:返回流的位置。对于二进制流返回值为距离文件开始位置的字
用C语言获取文件的大小示例分享
查了一下发现同C语言的文件操作函数便可以很容易的实现这样的功能。在自己实现的函数中使用到的函数就只有
fseek
和ftell。它们的说明如下:
fseek
语法: #include
int
fseek
(
FILE
*
stream
,
long
offset
,
int
origin
); 函数
fseek
()为给出的流设置位置数据.
origin
的值应该是下列值其中之一(在stdio.h中定义): 名称 说明 SEEK_SET 从文件的开始处开始搜索 SEEK_CUR 从当前位置开始搜索 SEEK_END 从文件的结束处开始搜索
fseek
()成功
时
返回0,失败
时
返回非零. 你
详解C语言中
fseek
函数和ftell函数的使用方法
fseek
函数:
int
fseek
(
FILE
* _
File
,
long
_
Offset
,
int
_
Origin
); 函数设置文件指针
stream
的位置。如果执行成功,
stream
将指向以fromwhere为基准,偏移
offset
(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变
stream
指向的位置,函数返回一个非0值。 超出文件末尾位置,还是返回0。往回偏移超出首位置,还是返回0,小心使用。 第一个参数
stream
为文件指针。 第二个参数
offset
为偏移量,正数表示正向偏移,负数表示负向偏移。 第三个参数
origin
设定从文件的哪里开始偏移,可能取值为:SEEK_CU
fseek
用法:
int
fseek
(
FILE
*
stream
,
long
offset
,
int
origin
);
1、SEEK_SET 从文件开头开始定位 2、SEEK_CUR 从文件当前位置开始定位 3、SEEK_END 从文件末尾开始定位 #include <stdio.h> //
fseek
int
main(void){
FILE
*
file
;
long
offset
;
file
= fopen("tmp.c", "r"); if(!
file
){ pr
int
f("文件打开失败"); return 1; }
fseek
(...
C语言
69,335
社区成员
243,078
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章