var strm : TStringStream; s : string; begin strm := TStringStream.Create; try strm.WriteString('1ab3c'); strm.Position := 0; // strm.Position := 3; s := strm.ReadString(1); finally strm.Free; end; end;
var strm : TStringStream; s : string; begin strm := TStringStream.Create; try strm.WriteString('1ab3c'); //写入字符串 strm.Position := 0; //设定读取位置 s := strm.ReadString(1); //参数为读取的长度 //s为读取的结果, lz根据情况作类型转换即可 finally strm.Free; end; end;
用 stream 处理结构化数据需要编码解码,每段数据由 head 和 body 组成。head 是定长的,用来标志数据类型和长度(或许还有应用所需的其他标志),body 包含数据本身。读 stream 时,总要先读出 head,然后根据其中的标志读 body。因为 head 中有长度标志,所以这样一路读下去也不会错位。像多媒体流那是很复杂的编码,只要读写都遵循同样的规范就不会出错。
strm : TStringStream;
s : string;
begin
strm := TStringStream.Create;
try
strm.WriteString('1ab3c');
strm.Position := 0;
// strm.Position := 3;
s := strm.ReadString(1);
finally
strm.Free;
end;
end;
strm : TStringStream;
s : string;
begin
strm := TStringStream.Create;
try
strm.WriteString('1ab3c'); //写入字符串
strm.Position := 0; //设定读取位置
s := strm.ReadString(1); //参数为读取的长度 //s为读取的结果, lz根据情况作类型转换即可
finally
strm.Free;
end;
end;
类似下边的代码
---------------
var
s : string;
n : integer;
begin
s := strm.ReadString(1); //读出字符存入s
if s 是字符 then
n := strtoint(s);
end;
var
strm : TStringStream;
s : string;
n : integer;
begin
strm := TStringStream.Create;
try
strm.WriteString('1ab3c'); //写入字符串
strm.Position := 0; //设定读取位置
s := strm.ReadString(1); //参数为读取的长度
//已知s的值为'1', 所以直接转整形了, 实际应用中不能这么干
n := strtoint(s);
finally
strm.Free;
end;
end;
Strm.Read(N, SizeOf(N)); // 整数读到变量 N 中当初必须是这样把整数写进 stream 中去:
Strm.Write(N, SizeOf(N));即使是 record 类型,也可以这样读写。当然,record 内部成员必须定长。如果有不定长数组和字符串之类的变量,就会读错。
a1:array[0..3] of Byte=($00,$00,$00,$12);
var
ss:TStringStream;
iC:Integer;
begin
ss:=TStringStream.Create('');
try
ss.Write(a1,sizeof(a1));
ss.Position:=2;
ss.Read(iC,sizeof(Integer));
finally
ss.Free;
end;
ShowMessage(IntToStr(iC));
end;iC应该=18,但运行下来iC是个很大的数字