关于LoadFromFile读不出文档的问题(100)

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

gaoqing

Unregistered / Unconfirmed
GUEST, unregistred user!
我用Tstringlist.LoadFromFile读取一个文档但读不全,发现文档中有一行#0#0组成的行,此行后全不文档不能读取!看LoadFromFile源码中有如下代码。不能读取#0,请问大家为什么不能读#0,他有什么特殊含意吗,如何才能读能?还有大家是否有好的方法解决此问题(用AssignFile可以,但会锁住文件)?procedure TStrings.SetTextStr(const Value: string);var P, Start: PChar; S: string;begin BeginUpdate; try Clear; P := Pointer(Value); if P <> nil then while P^ <> #0 do begin Start := P; while not (P^ in [#0, #10, #13]) do Inc(P); SetString(S, Start, P - Start); Add(S); if P^ = #13 then Inc(P); if P^ = #10 then Inc(P); end; finally EndUpdate; end;end;
 
对于文本来说,#0字符意味着字串的结尾.所以TStrings读文本文件时,认为#0就结尾了.而含有#0字符的文件,不能认为是"文本文件",而是"二进制文件",可以用TFileStream来读,然后再结合TStringStream来处理比如先用TFileStream读入文件,然后用TStringStream复制上述流,然后处理掉#0.就直接得到String了.当然这不是唯一方法.
 
var MS:TMemoryStream; Buf:array[0..4096]of char MS:=TmemoryStream.create;try MS.LoadFromFile(...) MS.Seek(0,soFromBeginning); MS.Read(Buf,ms.size);finally MS.freeend;
 
用AssignFile可以,但会锁住文件????不会吧,我经常使用,从来没锁定文件。是你的方法不正确。不会是你没有打开文件后,没有关闭吧。procedure TLoadFile.Execute;var SourTxt: TextFile; s: string;begin AssignFile(SourTxt, StrFileName); ReSet(SourTxt); try while (not Eof(SourTxt)) do begin s := ''; ReadLn(SourTxt, s); MemoData.Lines.Add(s); Application.ProcessMessages; end; SendMessage(HMainForm, UM_DATASYC, READ_SUCCESS, 0); except SendMessage(HMainForm, UM_DATASYC, READ_ERROR, 0); end; CloseFile(SourTxt); //你是不是没有这句 end;
 
首先感謝大家的回答!我们有两个程序一个写,一个读。szf,菜鸡的方法是可以可是有些复杂了,我读出后还要去了#0 后还要找到序号行数,速度不是很理想。用AssignFile时由于两个程式在用,读的时候需要一些时间处理,这样我用AssignFile时还没有close时,可能另外程序就访问了,这样会造成死锁(以前这样写过,发生很频繁)。请大家再费费心,看看还有其他好方法吗?我能重载LoadFromFile函数吗?要怎么写?
 
真是拔出萝卜带出泥了,从原来的"读不出文件"变成"多进程并发读文件"了."读出后还要去了#0 后还要找到序号行数,速度不是很理想"-- 难道是Size=10M以上级数的文件进行读写操作? 还是使用386在跑程序?老实说,分析某些字符,然后处理,这个绝对不是造成速度慢的原因,这个工作不在这里做,就在其它地方做,工作量是一样的,速度也差不了多少.程序功能正常,但速度慢一般是反复做了很多很多不应该做的判断和空操作.回到正题: 文件存取必然会带个锁定的问题,只是这个锁有级别差异而已,但我从来没听说过会带来死锁的--所谓死锁一般是某个程序没有解除锁定,而另外一个程序无限等待,其实这不算死锁,只是资源锁定而已.多进程并发存取文件,还要考虑文件数据一致性, "用AssignFile时还没有close时,可能另外程序就访问了,这样会造成死锁" --这个就是操作系统对文件数据的保护机制如果多进程对某程序都是只读,那么并发操作不会引起问题, 无论是用FileStream(注意Mode和Rights参数-请看帮助)还是AssignFile + Reset.同理,当文件作写入更新时,一般是排除其它写操作(避免数据混乱)或读操作(无效数据).很明显,操作时间越长,引起锁争用的机率越大.所以,象AssignFile-你的代码-CloseFile 这样的话,锁冲突的机率就大多了.而Stream.LoadFormFile里面已经包含了打开文件关闭文件, 后面再跟你的代码,锁的机率当然就很小了.说了这么多,当是授人以渔吧, 你的三个问题我回答如下:1.还有其它好方法么?(需求不清晰,可能有)2.能重载LoadFromFile函数吗?(绝对可以,但效果跟原来相比的结果难以预料)3.要怎么写?(....)
 
难得看到这么长的回答,支持一下。
 
早看到了szf的回覆,可是想來想去不知道如何感谢,一直拖到现在。头次发帖,szf如此详尽的回答。真的很感到。大家说的方法我都在不断的试验中。如结果我会发上来的,谢谢大家。
 

Similar threads

S
回复
0
查看
688
SUNSTONE的Delphi笔记
S
S
回复
0
查看
683
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部