用FileSystemObject里面的OpenTextFile打开一个文件文件,怎样将指针指到某一行,还有怎样知道有多少行内容

dreamtou 2004-07-08 10:08:50

i=0
Do While a.AtEndOfStream <> True
retstring = a.ReadLine
i=i+1
Loop
不用这种方法,因为如果文件很大,那不知道要循环到什么时候
...全文
355 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kmzs 2004-07-08
  • 打赏
  • 举报
回复
delphi,晕
dreamtou 2004-07-08
  • 打赏
  • 举报
回复
我周围的人可能 只知道我叫大头,真名可能都没人知道了
TechnoFantasy 2004-07-08
  • 打赏
  • 举报
回复
实际delphi的TStrings是直接把全部文本内容读到字符串中的:

procedure TStrings.LoadFromFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;


procedure TStrings.LoadFromStream(Stream: TStream);
var
Size: Integer;
S: string;
begin
BeginUpdate;
try
Size := Stream.Size - Stream.Position;
SetString(S, nil, Size);
Stream.Read(Pointer(S)^, Size);
SetTextStr(S);
finally
EndUpdate;
end;
end;

上面的是TStrings的LoadFromFile的实现,其实他是打开文件後调用了LoadFromStream方法,改方法将文件内容读到字符串S中,然后调用SetTextStr设置S到TStrings行中,而SetText方法如下:

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;

实际也是判断chr(13)chr(10)来实现分行的。
dreamtou 2004-07-08
  • 打赏
  • 举报
回复
我错了,delphi读大文件也要一个过程,和skipline不做什何别的处理时间差不多
hhjjhjhj 2004-07-08
  • 打赏
  • 举报
回复
用ADO好了
用GetString读取时,用“,”作为连接符



另:楼主怎么也取名大头??
dreamtou 2004-07-08
  • 打赏
  • 举报
回复
想想也是,一下子要把一个大文件读出来肯定要很长时间,那OpenTextFile是怎么把文件读出来,并已经分行好的呢?是不是readline,从文件里面取一行,也就是一点一点的读顺序读,只取一行?如果是顺序的读还可以理解,那delphi可以直接读某一行又是什么原理呢?而且已经知道有几行了。这个过程不管文件有多大,都用不了一秒啊
LichKingSZ 2004-07-08
  • 打赏
  • 举报
回复
。。。那你也可以自己写一个文本操作类呀,内部封装你需要的功能,这样以后都可以直接使用了(想想也知道delphi也不过是自己写的文本类,最多效率和安全性要高,只能说MS并没有为VB开发者提供太全面的功能...)
LichKingSZ 2004-07-08
  • 打赏
  • 举报
回复
那还不如用open ... for input as #n来得快,方法应该很多。
dreamtou 2004-07-08
  • 打赏
  • 举报
回复
这个时候就不如Delphi了,D里面的Tstrings,可以直接知道有多少行,也可以直接取某行的数据
dreamtou 2004-07-08
  • 打赏
  • 举报
回复
如果用readall的话,一旦文件很大这条语句都不知道要运行多久
LichKingSZ 2004-07-08
  • 打赏
  • 举报
回复
Q1A:可以使用textstream的skipline方法,调用一次跳到下一行,要到n行:
for i=1 to n
objstream.skipline
next

Q2A:一个不是很好的方法:先用textstream的readall方法把text读到一个string var中,然后判断var中有多少个vbcrlf(或是chr(10)/chr(13))就可以了(我认为这个方法也不比你的方法效率高...)。
TechnoFantasy 2004-07-08
  • 打赏
  • 举报
回复
用SkipLine方法只能跳过1行,跳多行的话需要多次调用。


没有直接的方法知道当前行和最后一行之间的距离。可以用Line属性和SkipLine方法结合来判断距离。
TechnoFantasy 2004-07-08
  • 打赏
  • 举报
回复
用SkipLine方法跳过N行

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧