代码之家  ›  专栏  ›  技术社区  ›  Fabrizio RAHUL S R

如何切割TStringStream的最后N个字符?

  •  0
  • Fabrizio RAHUL S R  · 技术社区  · 6 年前

    我在写一些字符串到 TStringStream 用字符串分隔符将它们分开。

    var
      Stream : TStringStream;
      i : integer;
      Separator : string;
    begin
      Separator := '|';
      Stream := TStringStream.Create('');
      try
        i := 0;
        while(i < 5) do
        begin
          Stream.WriteString(IntToStr(i) + ' test' + Separator);
          Inc(i);
        end;
    
        Stream.Size := Stream.Size - Length(Separator) * SizeOf(Char);
    
        Stream.SaveToFile('.\test.txt');
      finally
        Stream.Free;
      end;
    end;
    

    在循环的末尾,我要删除最后一个分隔符:

    Stream.Size := Stream.Size - Length(Separator) * SizeOf(Char);
    

    它产生以下结果 test.txt

    0 test|1 test|2 test|3 test|4 tes
    

    SizeOf(Char) 德尔福XE7 是2,但看起来 TStringString

    0 回复  |  直到 6 年前
        1
  •  2
  •   Fabrizio RAHUL S R    6 年前

    可以使用 TEncoding.GetByteCount

    返回由编码字符生成的字节数。注意 字符串中的字节数不一定与 给定字符数组或字符串中的字符数。

    要计数的字节。

    S参数是指一个UnicodeString,其中字节计数 将被提取。

    CharCount参数指定要编码的字符数。

    CharIndex参数指示Chars数组中的索引 从哪里开始计数。

    CharCount参数指示应该 在计算字节数时包括在内。

    返回值是传递的字符中的字节数 参数。

    Stream.Size := Stream.Size - Stream.Encoding.GetByteCount(Separator);
    
        2
  •  1
  •   Remy Lebeau    6 年前

    TStringStream的Size属性在写入数据时自动(不可避免)更新。所以肯定要做的是分开写分隔符并立即记录流的大小 之前 你做到了吗?然后,当您想放弃最后一个分隔符时,您可以轻松地在该点截断流。

    var
      PrvSize : Int64;;
    
    [...]
      PrvSize := Stream.Size
      Stream.WriteString(Separator);
    [...]
      Stream.Size := PrvSize;