大家有没有用过String数组来读取文件流?(100分)

  • 主题发起人 主题发起人 almeidar
  • 开始时间 开始时间
A

almeidar

Unregistered / Unconfirmed
GUEST, unregistred user!
var
f : TFileStream;
s,t : array[1..100] of string;
begin
s[1]:='abcde';
s[2]:='fghij';
....
s[100]:='xxxxx';

f:=TFileStream.Create('c:/tmp',fmCreate);
f.Write(s,SizeOf(s));
f.free;

f:=TFileStream.Create('c:/tmp',fmOpenRead);
f.Read(t,SizeOf(t));
f.free;
end;

为什么写文件时正确,在读取文件放于String数组中即出现“指针操作”错误?
用char和pchar又无法存放字符串,请赐教。
 
真春,还不如用 TStringList 呢!
 
你这样写当然不行了因为string上实际是一个指针。
 
写文件:
s:='abcdef';
fs:=TFileStream.Create('c:/temp',fmCreate);
try
fs.Write(s[1],Length(s));
finally
fs.free;
end;

读文件:
fs:=TFileStream.Create('c:/temp',fmOpenRead);
try
SetLength(s,fs.Size);
fs.Read(s[1],fs.Size);
finally
fs.free;
end;
 
真受不了你们:

var s:tstringlist;

写文件:
s.text:='abcdef';
s.savetofile('c:/.....');

读文件:
s.loadfromfile('c:/.....');
 
To 一个过客:

聪明的人永远不要把别人看得太蠢。

直接读自然有直接读的道理。
涉及效率问题,还能处理二进制文件等方面。

在不清楚需求的情况下请不要作出无谓的评论。
 
老弟,好好看看人家的需求,是你不清楚还是我不清楚?
别没事就教育别人,多读点书。
 
看了一下题目,确实是我看不清楚。

要是需读取以#13,或逗号分割的多个字符串,使用TStrings是比较方便。


To 一个过客:

请自重一下身份,不要随便对别人的智商做出评价。
 
问题出在你的定义上:
>>s,t : array[1..100] of string;

TFileStream.Write() 要求一个无类型数组(BYTE数组)。
低级处理只能写入一个流 ---------- 一个连续的存储区。

应该申明为: s: array[0..255, 0..100] of char 的形式。
以保证存储区是连续和(大小)确定。

不过,这样写入内容后,已经是毫无意义了 ------- 把数组
当作 Buffer 用,还不如直接声明:var Buffer: PChar 了。
 
学术交流,大家都克制一点。人身攻击不能解决问题。

向这样的数组定义,无法实现一次性写入和读出。

还是推荐使用 TStringList:

var
s,t : TStringList;
begin
s := TSringList.Create;
s.Add('abcde');
s.Add('fghij');
....
s.Add('xxxxx');
s.SaveToFile('c:/tmp');
s.Free;

t:=TStringList.Create;
t.LoadFromFile('c:/tmp');
showmessage(t[0]);
showmessage(t[1]);
....
showmessage(t[99]);
t.free;
end;

 
写文件时正确吗? 只是写文件时没有报错罢了,其实也是不正确的
SizeOf(s)在这里是4*100=400,只是100个指针,而非内容
所以这样是写不进文件的。
读的时候是正确的,因为只是读了一些整数值而已,对你的程序来说是无意义的
f:=TFileStream.Create('c:/tmp',fmOpenRead);
f.Read(t,SizeOf(t));
f.free;
建议用上面几位说的,TStringList:
 
既然是文件流,不如就直接用流的方法嘛!
 
直接用一个buffer:array[0..1023]of byte 读比较好,免的用TStringList之类的东西要考虑什么
引用记数之类的,效率底下!
 
后退
顶部