在一个流文件中的某个位置有一个长度为32的字符串,现在要把它读出来。我想了3种办法,都编译通过。问题是大家看哪种方法最好?哪种方法存在问题?1------------------------------------------------------------------
var
  p : Pointer;
  s : string;
  
  p := AllocMem(32);
  fs.Read( p^,32 );
  s := StrPas( p );2------------------------------------------------------------------
var
  p : Pchar;
  s : string;
  
  p := StrAlloc(32);
  fs.Read( p^,32 );
  s := StrPas( p );3------------------------------------------------------------------
var
  p : array[0..32]of char;
  s : string;
   
  fs.Read( p[0],32 );
  s := p;

解决方案 »

  1.   

    第四种方法更好:
    var
      s: String;
    begin
      SetLength(s, 32);
      fs.Read(s[1], 32);
      ...
      

  2.   

    对了,第一、二种办法有时会出现问题,即s := StrPas( p );结果不正确,s的长度超过32,
    例如流中的字符串是'xxxxxxxx',转换后成了'xxxxxxxx S:'我想这是因为PChar是以NULL结尾的字符串,执行StrPas函数时系统无法确定p的长度。可问题是为什么有的时候转换的结果又是正确的呢?
      

  3.   

    LLanV报表工具(打印预览软件)--免费使用--免费升级一流的打印预览软件
    超越水晶报表,是我们的目标
    特别适合用于轻松快速解决大量报表的情形
    彻底解除程序员负担,极大提高用户设定灵活性
    经过了10000行以上数据的压力测试,性能优良!其中一部分功能如下:  
    1.支持资料卡(比如:个人简历),表单(比如:销售定单),报表(比如:销售月报表)的预览打印
    2.不用任何设定,就可以默认产生专业的页面
    3.用户可以一次性设定企业标准样式(比如:公司标志,台头)
    4.支持文本,线条,方框,图片,等报表元素
    5.对各报表元素和报表区域等提供丰富的属性
    6.用户可以在运行期间编辑文本,线条,方框,图片,明细列, 操作简单
    7.支持同一列相同数据合并成一个格
    8.可以在运行期间增删,调换明细列
    9.提供多种报表风格
    10.支持页合计,总计
    11.支持的套打报表
    12.支持MIS开发的各种开发工具:如VC、VB、Delphi等
    13.可以直接连接数据库
    14.用户可以把设定后的报表样式保存为报表样式文件
    15.报表头和报表尾均可多于一页
    16.报表样式文件格式完全开放
    17.可以实现中国式复杂报表样式
    18.无须编程请发EMAIL给[email protected]
      

  4.   

    其实这能快哪去?除非你做一个10000次的循环。都说delphi的string处理比较慢,其实用string能省很多事,因为:1、支持string操作的函数多,比如copy,delete,pos...你要是用静态的数组或者动态分配内存的指针,都没这个方便。2、按照字节访问快捷方便,比如s[100]3、因为1和2,string可以看作是超强内存manipulator!
      

  5.   

    对了,忘了3点:4、string自动管理内存,不怕泄漏5、和pchar互相的转换很方便。6、和其他类型之间的转换也很快,只要用函数:copymemory或者move比如
    var i:integer;
    s:string;
    begin
      s:='hello'+#0#0#0#10;
      copymemory(@i,@s[6],4);//具体参数顺序看帮助
      //这更能说明第三点。
    end;
      

  6.   

    用3比較好吧, 比較簡單理解, 又不容易錯!>>p := AllocMem(32);
    p := AllocMem(32 * sizeOf(char));
      

  7.   

    To yinxu(寻路):
    我为了演示才省略了内存释放。To 楼上各位:
    感谢大家,结贴了!本来想等RealLike用ASM给解释一下为什么第一、二种办法有时会出现问题,现在想来必要性也不大了,我猜测可能是因为PChar是以NULL结尾的字符串,系统无法确定p的长度,一直找到NULL为止,结果越界了。
      

  8.   

    不对啊,不能放过问题,为什么第一、二种办法有时会出现问题而第三种不会出问题呢?var
      p : PChar;
      a : array[0..255]0f Char;
      s : String;  s := p;
      s := a;
      
    我想知道在s := a;背后Delphi作了些什么?
    RealLike快来,再出200分等你来拿!另,哪位仁兄给解释一下字符数组转化为String的内部机制同样给200分!
      

  9.   

    哦这样啊!字符串的长度其实应该是比实际字符的长度高出一位,字符串本身这种数据类型的定义上就是字符数组,不过它的下标为0的位保存的并不是字符串的第一个字符。我用VC++和Delphi传递数据的时候,如果用Delphi传递给VC++一个String 类型的数据的话,在VC++的内存调试中,下标为0的位保存了一个整形数据,但是这个值并不是字符串的长度,我怀疑这个是引用记数的值,不过这个值在Delphi中是根本取不出来的,已经被Borland封装过了