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

  有些人提倡当在结构里面包含字符串类型的时候最好采用定长的方式。

  比如像下面这样:

  TCSInfo = record

  Cs_Str :String;    

  Count  :Integer;

  CS_Str2 :String;

  end;

  如果Cs_Str在这里不采用定长的方式,那么当采用SizeOf()获取结构的大小的时候,可能得不到正确的大小值。

  另外这个首位成员变量的值,很有可能出现随机值的情况,就是你已经给它赋了值,在当前的显示是正确的,但是——

  如果把该结构保存为结构文件的时候,下次打开取值的时候就会出现随机值的情况。

  但是后面的变量的值是正常的,所以如果字符串变量放在首位,那么应该采用定长的方式:

  Cs_Str :String[20];

  或者把Count放在首位。

  有些朋友没有试过存储过结构化文件,所以在程序运行的时候,不会发现有什么问题。

  简单的使用是不会发现问题,因为我在测试的时候,也发现第一次赋值的时候,完全没有发现问题。

  然后关闭程序,第二次打开文件的时候,就发现了问题。

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

  如果说是寻址的问题,那么为什么后面的变量值是正确的?

  我们知道文件流的指针位置如果不正确,那么是无法取得正确的结果的。

  总之涉及到字符串类型都是比较复杂的。

  如果不深究其中的原因,保证我们的程序完美实现,不会出现隐患。

  我的建议是:要么把其它类型的变量至于首位,那么后面的字符串可以不采用定长的方式。

  要么就采用定长的方式,这种情况最好必须把变量至于首位的情况下。

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

  我个人相当习惯采用流的方式来处理文件,但是采用内存流或者文件流处理文件会有好几个陷阱,会令人误以为不能够采用流的方式处理。

  这个问题下次我会提到。

  为什么需要习惯流的方式处理文件,主要的原因是需要了解大数据处理和各种结构化文件处理的问题。

  尤其是大多数的处理都是在内存里面进行,效率还可以。