AD商业广告自由选择
AD商业广告自由选择

Delphi结构类型包含String字符串使用需要注意的地方

正文概述 开源人   2024-11-03 16:00:13  

有些人提倡当在结构里面包含字符串类型的时候最好采用定长的方式。Wgv1234FCOM专注游戏工具及源码例子分享

  比如像下面这样:Wgv1234FCOM专注游戏工具及源码例子分享

  TCSInfo = recordWgv1234FCOM专注游戏工具及源码例子分享

  Cs_Str    :String;    Wgv1234FCOM专注游戏工具及源码例子分享

  Count  :Integer;Wgv1234FCOM专注游戏工具及源码例子分享

  CS_Str2 :String;Wgv1234FCOM专注游戏工具及源码例子分享

  end;Wgv1234FCOM专注游戏工具及源码例子分享

  如果Cs_Str在这里不采用定长的方式,那么当采用SizeOf()获取结构的大小的时候,可能得不到正确的大小值。Wgv1234FCOM专注游戏工具及源码例子分享

  另外这个首位成员变量的值,很有可能出现随机值的情况,就是你已经给它赋了值,在当前的显示是正确的,但是——Wgv1234FCOM专注游戏工具及源码例子分享

  如果把该结构保存为结构文件的时候,下次打开取值的时候就会出现随机值的情况。Wgv1234FCOM专注游戏工具及源码例子分享

  但是后面的变量的值是正常的,所以如果字符串变量放在首位,那么应该采用定长的方式:Wgv1234FCOM专注游戏工具及源码例子分享

  Cs_Str    :String[20];Wgv1234FCOM专注游戏工具及源码例子分享

  或者把Count放在首位。Wgv1234FCOM专注游戏工具及源码例子分享

 Wgv1234FCOM专注游戏工具及源码例子分享

  有些朋友没有试过存储过结构化文件,所以在程序运行的时候,不会发现有什么问题。Wgv1234FCOM专注游戏工具及源码例子分享

  简单的使用是不会发现问题,因为我在测试的时候,也发现第一次赋值的时候,完全没有发现问题。Wgv1234FCOM专注游戏工具及源码例子分享

  然后关闭程序,第二次打开文件的时候,就发现了问题。Wgv1234FCOM专注游戏工具及源码例子分享

  而且凡是前面的变量的类型是String的话,得到的全部是随机值,但是只要紧随其后有一个别的类型,那么之后的非定长的字符串变量的值却是正常的。就像上面的CS_Str2那样,值是正常的,问题出现在其它类型变量之前的非定长字符串类型的变量的身上。Wgv1234FCOM专注游戏工具及源码例子分享

  如果说是寻址的问题,那么为什么后面的变量值是正确的?Wgv1234FCOM专注游戏工具及源码例子分享

  我们知道文件流的指针位置如果不正确,那么是无法取得正确的结果的。Wgv1234FCOM专注游戏工具及源码例子分享

  总之涉及到字符串类型都是比较复杂的。Wgv1234FCOM专注游戏工具及源码例子分享

  如果不深究其中的原因,保证我们的程序完美实现,不会出现隐患。Wgv1234FCOM专注游戏工具及源码例子分享

  我的建议是:要么把其它类型的变量至于首位,那么后面的字符串可以不采用定长的方式。Wgv1234FCOM专注游戏工具及源码例子分享

  要么就采用定长的方式,这种情况最好必须把变量至于首位的情况下。Wgv1234FCOM专注游戏工具及源码例子分享

  采用定长的方式,会浪费很多空间,而且文件不会很紧凑,而且大多数时候,我们的值都是不确定的,如果采用定长的方式,显然会导致在赋值的时候带来不可预料的情况,当然自己使用不会有问题,如果是客户,那么我们不得不增加代码的开销来避免这种情况的出现,对吧。Wgv1234FCOM专注游戏工具及源码例子分享

  我个人相当习惯采用流的方式来处理文件,但是采用内存流或者文件流处理文件会有好几个陷阱,会令人误以为不能够采用流的方式处理。Wgv1234FCOM专注游戏工具及源码例子分享

  这个问题下次我会提到。Wgv1234FCOM专注游戏工具及源码例子分享

  为什么需要习惯流的方式处理文件,主要的原因是需要了解大数据处理和各种结构化文件处理的问题。Wgv1234FCOM专注游戏工具及源码例子分享

  尤其是大多数的处理都是在内存里面进行,效率还可以。  Wgv1234FCOM专注游戏工具及源码例子分享



声明:本文系互联网搜索而收集整理,不以盈利性为目的,文字、图文资料源于互联网且共享于互联网。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。