如何逐行读取一个30多M的文本文件(100分)

  • 主题发起人 主题发起人 yangguangbingdi
  • 开始时间 开始时间
Y

yangguangbingdi

Unregistered / Unconfirmed
GUEST, unregistred user!
[?][:(]我需要打开一个30多M的文本文件进行循环搜索,如果用reset打开配合while not Eof( ) do,
readln()后只读出了第一行,就跳出循环了,但打开一个5M的文件就没事,不知是什么原因,能解决吗?
是不是需要编写内存缓冲方案?具体怎样做?能举例说明吗???
急切等待答案,请各位大哥帮小妹一把!!![red][/red]
还有就是当使用readln()读到最后一行以后如何在回到开头的第一行而不用reset()?
另外delphi中我想直接打开远程UNIX服务器中的一个文本文件行吗?(不下载)如何实现???
 
用文件流(TFileStream)就可以了,
如果想提高速度用文件隐射最好,但是稍微麻烦了一点!
 
也可以用TStringList直接调入内存,然后逐行分析
 
敢问张大哥:文件流(TFileStream)怎么用?我没用过,能举例说明吗?
我需要打开一个30多M的文本文件进行循环搜索,如果用reset打开配合while not Eof( ) do,
readln()后只读出了第一行,就跳出循环了,但打开一个5M的文件就没事,不知是什么原因?
 
Traveller兄:用TStringList直接调入内存我已试过了,会报错说溢出。
 
另外delphi中我想直接打开远程UNIX服务器中的一个文本文件行吗?(不下载)如何实现???
哪位高手能回答?
 
readln()对于纯文本有效,如文本文件中夹有某些控制字符会导致中途退出。
像这么大的文本文件还是分段读进内存分析处理比较稳定、可靠,如采用blockread等,可参考有关文档。
 
能告诉我你怎样把一个纯文本文件能够存30M的东西
谢谢
 
To 我是一条鱼:
2000下的记事本就可以
 
直接用文件流,先分配一个缓冲区,在缓冲区里找换行,找完这个缓冲,再接着
读数据,再重复前一个步骤!
 
无忌兄:我实在是不会使用文件流,直接用文件流,分配缓冲区也没用过。对于(先分配一个缓冲区,在缓冲区里找换行,找完这个缓冲,再接着
读数据,再重复前一个步骤!)能不能说得具体一点,举例说明,不胜感谢!
 
文件流
procedure copyfile;
var f1: tfilestream ;
begin
f1:=Tfilestream.Create(sourcefilename,fmopenread);
....
 
缓冲区怎么用呀?能举例说明吗?最好详细点,将不胜感激!
 
你是用TStringList还是用Memo.Lines加载的?它们区别可是很大的哦。
TStringList容量应该是足够的啊,它可以载入 "2G div 16 = 2^17 = 128M" 行文本,每行文本的最大长度是2G,30M数据是小菜一碟
 
如果想用缓冲区可以用TMemoryStream,使用非常简便
Buf := TMemoryStream.Create;
try
Buf.LoadFromFile('FileName.txt');
p := PChar(Buf.Memory);
// 此时p指向文件缓冲区头部,可以用如下循环进行处理
for i := 0 to Buf.Size - 1 do
p...
finally
Buf.Free;
end;
 
你一次分配30M内存,需要时间了,速度慢了,而且也没有必要啊!
 
楼主的目的是对全文进行搜索而不是只检索部分数据,一次性调入比零散调入应该反倒会快才对,而且如果文件真的位于unix服务器上,那么缓冲节约的网络传输时间应该比分配内存然后进行一次网络IO更多。
如果楼主注重运行效率,那么不妨先进行一下试验;如果注重代码的简洁,那么TStringList方案应该是适用的。当然,正如你所说,内存映像是最快的方式,编程其实也不算复杂。
 
张无忌:你还是没有举例说明你的建议呀!
Traveller:我想你误会了,文件的确是位于UNIX远程服务器上,但由于找不到直接访问远程服务器上文件的办法
所以我是用NFTP下载到PC机本地来做的,照你的说法好像有直接打开远程服务器上文本文件的办法,
如果有请不吝赐教,因为我觉得直接访问的方式会更好,
因为UNIX服务器无论是文件系统还是机器性能都更胜一筹
 
我一般只是给个建议,我自己以前2种办法都用过,
,至于如何用,你找找资料就行,
 
用stream,memorystream很容易死翘翘,根本作不到一次性读取30m
大约6,7就会有问题,当然运气好十几兆也可以独
 
后退
顶部