怎么将一个Record类写入Stream中啊?(100分)

  • 主题发起人 gondsoft
  • 开始时间
G

gondsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如下:
TUserInfo=Record
userNo:String[10];
userName:String[20];
end;

procedure writeStream(userInfo:TUserInfo);
var
stm:TMemoryStream;
begin
stm:=TMemoryStream.Create;
stm.write(userInfo,sizeOf(userInfo));
//上述写入的是类的实例指针,怎么才能将类完全写到流中呢?
end;
 
当然可以呀.记录文件不就是这样生成的吗?
前提是你定义的
TUserInfo=Record
userNo:String[10];
userName:String[20];
end;
string类型必须是界定了大小的,否则不行.
 
//上述写入的是类的实例指针,怎么才能将类完全写到流中呢?
不对,userInfo是记录类型数据,不是类.写入的不是指针,而是值.
 
//www
请问为什么要设定string类型的大小呢?
另外有哪些类型需要设置它的大小?有检测记录类型变量是否有效的函数吗?
 
写之前必须确定所写类型的大小,STRING类型长度不能固定,编译器不知内存如何分配。
不光STRING不行,变长数组等长度不固定的数据类型都不行
 
//另外有哪些类型需要设置它的大小?
反着问更好:)仅有以下类型不需要设置其大小(或者说适用于简单操作):
1.所有整型
2.所有实型(包括日期)
3.所有枚举类型
4.字符
5.符合以上要求的记录类型
 
有检测记录类型变量是否有效的函数吗?
 
//检测记录类型变量是否有效
什么意思,你说的“有效”我不明白
 
因为我开始没有在record类型中设置string变量的大小,所以写入Stream后,再从stream中
读出到record记录中时,record变量为'不可接束的对象'的错误,访问这个变量时也出现
错误.
 
内容已经写入,你执行一下以下的例程:

type
TUserInfo=packed Record
userNo:String[10];
userName:String[20];
end;


procedure TForm1.Button2Click(Sender: TObject);
var
stm:TMemoryStream;
userInfo:TuserInfo;
b:array[0..20] of char;
s:string;
n:integer;
begin
stm:=TMemoryStream.Create;
userinfo.userNo:='1234567890';
userinfo.userName:='1这是人的名字';
stm.write(userInfo,sizeOf(userInfo));
showmessage(inttostr(stm.Size ));
//长度增加了2 ,把两个 string[0] 也写进去了
stm.Position:=0;
stm.Read(b,11)
//多读一个
n:=integer(b[0]);
showmessage(inttostr(n))
//b[0] 是长度
s:=pchar(b+1);
setlength(s,n);
showmessage(s);

stm.Read(b,21);
n:=integer(b[0]);
showmessage(inttostr(n))
//b[0] 是长度
s:=pchar(b+1);
setlength(s,n);
showmessage(s);
end;
 
谢谢各位的帮忙! 特别是www,beta!
 
TUserInfo=Record
userNo:String[10];
userName:String[20];//
end;
之所以是用定长字符串原因是,一个自定义类型存储的内容必须是定长的才可以为他分配长度
否则字存储一个指针例如
type
TUserInfo=packed Record//加上Packed是表示紧凑方式,不让编译器对其进行4个字节的对齐优化
userNo:String;
userName:String[20];//
end;那么编译器无法为其分配内存,因为UserNO字段的长度是不一定的。该处只能存储一个指针
如果保存的话就只有四个字节,保存的是指针,毫无意义。
showmessage(inttostr(SizeOf(TUserInfo)));
就会是25,因为UserName占了21个字节(短字符串前面有一个字节记录长度)再加上一个指针的长度
4就是25。

type//短字符串的结构如下,凡是指定长度的字符串一定是短字符串,长度不超过255(因为长度字段是Byte最大值只能存放255)。
ShortString=record
length:byte;
data:array[1..length] of char;
end;
那么你给出的帖子中保存记录已经成功了,不象你所说的是指针,更不是什么类而是一个
自定义类型变量。
 
顶部