加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
今天读一个INI遇到个Buf,现将解决办法发上来共享一下
smrken2013/08/01软件综合 IP:广东
声明:本文由科创论坛smrken会员发表,转载请注明出处,谢谢!
环境:delphi 7
问题动作:procedure TIniFile.ReadSectionValues(const Section: string; Strings: TStrings);
问题描述: 读取某节点下的全部键和值,当内容较多时出现读不完的情况
网上类似的问题:http://hi.baidu.com/335204019/item/02eb2f45c3628714896d1086
一开始我没有看其源码,直接搜索了,只找到类似的疑问! 然后我就翻阅其源码,发现该源码单元比较简短,正好...

问题原因追查源码:
ReadSectionValues主要调用了ReadSection,而ReadSection的设计有缺陷下面贴出其原源代码

//******************
const //声明:本文由科创论坛smrken会员发表,转载请注明出处,谢谢!
  BufSize = 16384;
主要原因是内存不够,而又没有根据情况重新分配一个适合的内存大小,
其原源码只是简单检查起是否读取失败!
API参考连接:http://baike.baidu.com/view/1290400.htm
解决办法,将这个IniFiles.pas文件直接添加到工程,然后直接修改成如下样子,就可以不改动其余东西,解决这个问题!
//******************
检查返回值,若指示内存不够容纳,则使用ReallocMem来重新分配

//声明:本文由科创论坛smrken会员发表,转载请注明出处,谢谢!
谢谢收听, 全文完.
来自:计算机科学 / 软件综合
3
新版本公告
~~空空如也
phpskycn
12年2个月前 IP:未同步
554514
回 楼主(smrken) 的帖子
LZ能解释一下为何会内存不够么……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smrken作者
12年2个月前 IP:未同步
554554
回 1楼(phpskycn) 的帖子
假设INI文件内容有如下:
[Node]
Key=Value
-------------------------
"Key=Value" 需要9个字节长度的内存,再加上一个0结尾,正常是要10个字节!
如果GetPrivateProfileString(...)中的nSize的值比需求小,就会出现特定的返回值!
而原源代码的设计使用了固定的内存大小进行一次性分配,并且仅检查是否失败,并没有针对内存与实际内容不匹配时
的解决方法,
文中的修改,就是增加了相应的检查和处理,使之能处理较大的INI,
+50
科创币
phpskycn
2013-08-02
赞,,可惜俺对D不熟悉……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的