一个文本文件用内存映射打开后,如何一行一行地进行读取?(50分)

  • 主题发起人 主题发起人 星空
  • 开始时间 开始时间

星空

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。因为每一行要进行处理,所以只能一行一行地读。
 
TStream 只对字节流读写,不管这些字节的含义的,你可以用 TextFile 类型的文件格式<br>读写文本文件,下面是 AssignFile 函数帮助中的例子:<br>var<br>&nbsp; F: TextFile;<br>&nbsp; s: string;<br>begin<br>&nbsp; if OpenDialog1.Execute then &nbsp;//选择文件<br>&nbsp; begin<br>&nbsp; &nbsp; AssignFile(F, OpenDialog1.FileName); &nbsp;//将 F 变量与指定文件关联<br>&nbsp; &nbsp; Reset(F); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //打开文件<br>&nbsp; &nbsp; Readln(F, s); &nbsp; &nbsp; &nbsp; //读出第一行<br>&nbsp; &nbsp; Edit1.Text := s;<br>&nbsp; &nbsp; CloseFile(F); &nbsp; &nbsp; &nbsp; //关闭文件<br>&nbsp; end;<br>end;<br>还有 ReWrite,Writeln 等函数可以写入一行。
 
如果你想一次操作一行,可以用 TStringList<br>读入文件后就自动按照里面的回车换行分好行了:<br>var<br>&nbsp; s: TStringList;<br>&nbsp; ss: string;<br>begin<br>&nbsp; s := TStringList.Create;<br>&nbsp; s.LoadFromFile('abc.txt');<br>&nbsp; ss := s.Strings[0];<br>&nbsp; showmessage('这就是第1行:' + #13#10 + ss);<br>&nbsp; s.Free;<br>end;
 
讲一下操作系统文件读行的原理了:<br><br>内存中开辟二个Buffer,Buf1, Buf2,打开文件读一个块到Buf1,<br><br>用串搜索算法找到&lt;CR&gt;&lt;LF&gt;或找到&lt;EOF&gt;,遇到&lt;EOF&gt;结束算法。若找到,把开始<br><br>制针到目前位置之间的字节复制到Buf2中,Buf2中就是一行,若找不到,先把<br><br>Buf1完全复制到Buf2中,超过255个字节就当一行。没超过把剩余的复制到Buf2,<br><br>再从文件流中读一块到Buf1中,重复该算法。
 
谢谢cwmdelpher。因为文件比较大,而要求的速度要快,所以想知道速度最快的方法是什么。
 
最快就是自己搜索换行符
 
多少行??如果有5000行,如果算每行80个字符,那么5000*80=400000=400K<br>用FileStream读进去,所需时间可以忽略 !!<br>
 
大概1000000行吧,还可能更多。
 
如果像这样的文本怎么解决呢<br><br>123.34 &nbsp; &nbsp;345.6 &nbsp; &nbsp;333.33 &nbsp; &nbsp;444.444<br>444.5 &nbsp; &nbsp; 456.5 &nbsp; &nbsp;334.56 &nbsp; &nbsp;4454.5<br><br>如何取得数据
 
发分了!
 
后退
顶部