在dos下写程序,用的是borland c++ 4.5,读取大于64K文件时出现错误,相当的郁闷。谁能救救我?

acneyouth 2006-12-26 12:16:10
问题的表现:程序完了以后,buf中只有文件的最后一小部分,长度大概就是len / readLen那么长,前边读取的部分应该是被覆盖了。
问题应该就出在memcpy上,可能是它不支持远指针(far *),但是我不知道应该用什么函数来替换它。
也可能是工程的内存模式的问题,我用的是huge模式,这里 是第二个问题:为什么我用large模式时,<iostream.h>中 的函数都会在build的时候出现link error:undefined symbol错误?

可怜可怜我吧!调试了很多天啦!

typedef unsigned char * puchar ;
typedef unsigned char _FAR * fpuchar ;

unsigned long mread(int fHandle , fpuchar buf , unsigned long len)
{
unsigned int readLen = UINT_MAX - 1 ;
int count = len / readLen ;
int lastRead = len % readLen ;
unsigned long pos = 0 ;
unsigned char * catche = new unsigned char[UINT_MAX - 1] ;
for(int i = 0 ; i <= count ; i ++)
{
if(i == count) readLen = lastRead ;
try
{
read(fHandle , catche , readLen) ;
memcpy(buf + pos , catche , readLen) ;
}
catch(...)
{
return 0 ;
}
pos += readLen ;
}
return pos ;
}
...全文
182 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
BenLeak(摇摆人) 能不能说的详细一点?如何申请使用ems?memcpy如何拷贝ems内存?
BenLeak 2006-12-26
  • 打赏
  • 举报
回复
在MS DOS 下不能申请超过 64k 的一页内存
16 位系统的限制
可以考虑使用 EMS 操作,每次操作 16k 是可以的
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
做个备份磁盘的东东,只能用dos了
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
别叹气,为什么要用dos程序处理呢?用32位系统就不存在这个问题了!
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
唉~~~
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
那就是说,直接小段读取文件,再处理,再读取,还是比较可行的办法?
===========================================================================
这是最好的办法,因为巨型指针不是所有函数都支持的。
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
那就是说,直接小段读取文件,再处理,再读取,还是比较可行的办法?
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
谁知道怎么把远指针中的内容传到常规内存?
================================================================================
不要误会,far和huge指针的内容也是常规内存,我上面说的是扩展内存和扩充内存需要传输到常规内存处理。
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
之所以把这么大(其实也就200K以下)的文件装进内存是为了处理方便,而且没写过dos程序,不知道这么罗嗦。我要处理的文件可能是单字节的文本,也可能是双字节的文本。处理双字节文本的时候如果不预处理成单字节的内容,处理起来就很麻烦,一点一点的读进来再处理速度可能也比较慢。

谁知道怎么把远指针中的内容传到常规内存?maozefa(阿发伯) 应该知道吧?
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
即使使用ems或者xms也只能解决装入问题,要分析文件内容,也得分批传输到常规内存才行。
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
不明白楼主把那么大的文件一股脑儿的装入内存干什么?即使huge* 能解决函数通过,可怎么使用这个指针里的内容也是个问题。一楼的也说了,DOS下的内存是分段的,64K是极限。
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
我把_FAR * 改成 huge *,这个函数里的问题是解决了,不过其它函数有问题了。huge*的东西拷贝到near指针中有没有什么特别的函数啊?
wohow 2006-12-26
  • 打赏
  • 举报
回复
看不出catche有什么用,只会增加麻烦。
没有用过Borland C++,不知道一块内存最大能有多大。
TurboC memcpy函数每种编译模式都有相应的版本,相信Borland C++也是,问题多半不是memcpy引起的,应该是buf引起的
i_love_pc 2006-12-26
  • 打赏
  • 举报
回复
不懂,帮顶!

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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