fseek偏移地址过大问题

hyhezhen 2006-02-09 09:31:36
因需要,用TURBO C (win-tc)写个小工具,对一个100多K的文件进行二进制读写。读写时移动指针到一个偏移地址,写入一组数据。发现偏移地址小于32768时,写入正常;偏移地址大于32768时,此DOS进程死掉一样,硬盘狂响,强制关机才能结束(CTRL+ALT+DEL结束任务没用)。
重新开机后,发先此文件被写到4G多大小。
后来尝试将偏移地址大于32768的,分成多次FSEEK,每次相对偏移小于32768,结果一样。
我看定义,偏移地址为long型,是正常的。

后来用VC编译,运行就一切正常。
但是WIN-TC编译的EXE才18K,而VC编译的180K;
想确认什么原因,能否让WIN-TC编译的程序也正常。

...全文
496 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyhezhen 2006-03-20
  • 打赏
  • 举报
回复
...
fseek(fp,OFFSET_BIN_DATA+loc*(0x100),0);
fwrite(&binBuffer,32*8,1,fp);

用WIN-TC编译
当OFFSET_BIN_DATA+loc*(0x100)小于32768时,正常;大于32768时,硬盘灯狂闪,结束任务后,发现文件有4G大。
用VC编译,运行,一切正常.

感谢jinjiajie(leorio)的回答,Release的文件,确实比DEBUG的小很多了。
megaboy 2006-03-14
  • 打赏
  • 举报
回复
把代码贴出来。
jinjiajie 2006-03-14
  • 打赏
  • 举报
回复
win-tc不是32位编译器吗?我没用过,不清楚。你说vc编译的比tc大,那是因为是debug版,realease版就小多了...
hyhezhen 2006-03-14
  • 打赏
  • 举报
回复
那么TC编写的程序,就不能访问偏移地址大于32768的数据了?有解决的办法么?
ma100 2006-02-13
  • 打赏
  • 举报
回复
偏移地址要用LONG定义,你是吗
另外,最好不要出现 类似
int i = 1;
long len;
len = 1 + i *1068;

输出len不是1069 ,不信你试试
这是早期汇编编译器的bug,MASM6也有这个BUG,下面是msdn上的一段
The Microsoft Macro Assembler (MASM) version 6.0 will generate incorrect code when the IMUL instruction contains an operand that is a constant value from 128 to 255. No errors or warnings are displayed while assembling.


Microsoft has confirmed this to be a problem in MASM version 6.0. This problem was corrected in MASM version 6.0a.


也就是说MASM在 imul的一个操作数是立即数,而这个数是128~255时会错
这点很象TC: 大于 128就错
arden1019 2006-02-09
  • 打赏
  • 举报
回复
mark
tracy19822004 2006-02-09
  • 打赏
  • 举报
回复
我也有时FSEEK也会出现奇怪的问题 而且好象于位移量的大小无关 我有个程序就fseek移动当前位置两位 也出现错误的数据
有时其他程序移的位置更大都没问题
我也觉得很奇怪
zez 2006-02-09
  • 打赏
  • 举报
回复
tc 本来就是16位的!!!
vc 编译成 release 版本,大小肯定不会太大..

这年头你还用tc???
jlxys 2006-02-09
  • 打赏
  • 举报
回复
32位最大就4G吧 要更大就要64位 __int64 _lseek64(),可到T级

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧