如何减少TStringStream的最后N个字符?

我正在将一些字符串写入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
Delphi XE7 中的

SizeOf(Char)为2,但似乎TStringString的每个字符使用一个字节。我想我不能认为它总是1字节,那么如何安全地从流中剪切出最后N个字符?

wwl776 回答:如何减少TStringStream的最后N个字符?

可以使用TEncoding.GetByteCount方法来完成。

  

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

     

Chars参数可以是字符数组或字符指针   包含要计数的字节。

     

S参数引用一个UnicodeString,字节计数从该字符串开始   将被提取。

     

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

     

CharIndex参数指示Chars数组内的索引   应该在哪里开始计数。

     

CharCount参数指示应该输入的字符数   计数字节时包含在内。

     

返回值是传递的Char或S中的字节数   参数。

可以从字符串流中删除最后一个分隔符,如下所示:

Stream.Size := Stream.Size - Stream.Encoding.GetByteCount(Separator);
,

将数据写入其中时,TStringStream的Size属性会自动(并且不可避免)进行更新。因此,确定要做的是分别写分隔符并在之前之前立即记录流的大小吗?然后,当您要丢弃最终的分隔符时,可以轻松地截断流。

var
  PrvSize : Int64;;

[...]
  PrvSize := Stream.Size
  Stream.WriteString(Separator);
[...]
  Stream.Size := PrvSize;
本文链接:https://www.f2er.com/3103366.html

大家都在问