用字符数组Array of char
或字节数组Array of byte

解决方案 »

  1.   

    如果是文件就好办了。无论你是用字符串,还是用TStringList,你目前的情况是先读出文件,再定位(不遍历,怎么定位,系统帮你遍历了)chr(0),再替换。干脆自己在文件中遍历,找到就替换,只用一个Byte变量
    const bb=32;
    var
     myfile:file of byte;
     aa:byte;
     i:integer;
    begin
     assignfile(myfile,'你的文件');
     try
      reset(myfile);
      for i:=0 to filesize(myfile)-1 do
      begin
       read(myfile,aa);
       if aa=0 then write(myfile,bb);
      end;
     finally
      closefile(myfile);
     end;  //end of try
    end;思路如上,程序不一定对;无论如何定位,至少要遍历一遍,因此我的方法应该是效率很高的
      

  2.   

    oracle_lover(数据库情人)的思路非常好,我也知道多开线程可以提高效率。希望大家能集思广益,看看还有没有其他更好的思路。
      

  3.   

    你自己遍历比StringReplace效率更高!StringReplace也需要查找一遍的,因此你自己写代码还好一些!问题的关键在于,你不能类似oracle_lover那样,那样做的效率很低,因为每次只读取1024Byte到内存,这样读取文件的次数增加,而且代码有问题!做好的做法是使用文件映射,或者自己定义一个大的缓冲区,一次性把所有文件内容缓冲到内存,处理完成之后,然后再一次心写入文件,这样就能够大大提高效率,你也可以使用FileStream来操作。
      

  4.   

    以前做过一个文本处理的程序,一兆大小的文件以MemoryStream读取以后遍历,时间大概在一到两秒钟;遍历是肯定要得,考虑考虑好的算法吧。
      

  5.   

    我有一个方法,与楼上所用的遍历不太一样.大家注意没有:murphy711 (蒙古土豆) 的文件里需要替换是chr(0),也即为字符串结束符.因此在处理时以一个字符串为单位来处理效果为更好.当然遍历是最好实现的方法;也较为容易实现.
    我这里有个思路,程序代码大致如下:
    var
      f: textfile;
      ss: string;
      c: pchar;
      Strings: TStrings;
    begin
      assignfile(f, '你的文件名称');
      reset(f);
      try
        Strings := TStringList.Create;
        try
          while not eof(f) do
          begin
            readln(f,ss);
            while length(ss) > 0 do
            begin
              c := pchar(ss);
              Strings.add(string(s));
              ss := Copy(ss, length(string(c))+2, length(ss));
            end;
          end; 
          showmessage(Strings.text);
        finally
          Strings.free;
        end;
      finally
        closefile(f);
      end;
    end;//以上程序在delphi6中调试通过.
    大家看看还有什么可以改进的,或更好的解决方案.
      

  6.   

    menliwxj(有缘):感谢你的方法,不过我这里的CHR(0)并不是实际的字符串结束符,而是在UNIX系统里面生成的,在文件中有多处,而且还可能有多个CHR(0)接连出现的,所以你说的那种方法恐怕不行。oracle_lover(数据库情人)的思路我已经尝试过了,gaoys1979(虫洞)的TMemoryStream的方法我也试验过,但是最终的结果都是在替换连续出现的CHR(0)时出现问题,程序如下:
    var
      my1:TMemoryStream;
      i:integer;
      cc:string;
    begin
      my1 := TMemoryStream.Create;
      my1.LoadFromFile('e:\test1.txt');
      for i:= 0 to my1.Size-1 do
        begin
          my1.Position := i;
          my1.ReadBuffer(cc[1],1);
          if cc=chr(0) then
            begin
              cc:= chr(32);
              my1.WriteBuffer(cc[1],1);
            end;
        end;
      my1.SaveToFile('e:\test1_chg.txt');
      my1.Free;
    end;
    我也试验过用下面的程序实现:
    var
      my1,my2:TextFile;
      cc:char;
    begin
      assignfile(my1, 'e:\test1.txt');
      reset(my1);
      assignfile(my2, 'e:\test1_chg.txt');
      rewrite(my2);
      while eof(my1) do
        begin
          read(my1,cc);
          if cc=chr(0) then
             write(my2,chr(32))
          else
             write(my2,cc);
        end;
      closefile(my1);
      closefile(my2);
    end;
    这个程序是可以实现的,问题是必须做一个临时的转换文件。
    不知道还有没有更好的办法。
      

  7.   

    文本文件的内容类似如下:
    阿瑟大发送到1231241chr(0)chr(0)2347867
    asdlfkasdflkchr(0)chr(0)935324sadf
      

  8.   

    使用oracle_lover(数据库情人)的思路和我的第一的程序的结果是,只能替换第二个chr(0),无法替换第一个,好像是在read后,指针已经指向了下一个byte.
      

  9.   

    tstringstream;
    tfilestream;
    pos(#0,stringstream.data);
      

  10.   

    我已经搞掂了,程序如下:
    var
      my1:TMemoryStream;
      cc:string;
    begin
      my1 := TMemoryStream.Create;
      my1.LoadFromFile('e:\test1.txt');
      my1.Position := 0;
      while my1.Position < my1.Size do
        begin
          my1.ReadBuffer(cc[1],1);
          if cc=chr(0) then
            begin
              cc:= chr(32);
              my1.Position := my1.Position -1; 
              my1.WriteBuffer(cc[1],1);
            end;
        end;
      my1.SaveToFile('e:\test1_chg.txt');
      my1.Free;
    end;谢谢大家了!