text1:一个文本文件。
我要读取text1的第20--25行,放到另外一个文件memo1里
注:text1文件太大,不能把text1全都放到memo控件里,要直从文件的第20行开始读
不知如何定位到第20行,请赐教
 
var file:textfile;
    
   AssignFile(file, 'd:\mytextfile.txt');
   Reset(file);
   
//    Seek(f, 20);//这句总是报错
    readln(f, s);
    memo1.Lines.add(s);

解决方案 »

  1.   

    var
      SL: TStringlist;
      lp: integer;
    begin
      sl := TStringlist.create;
      try
        sl.loadfromfile('d:\mytextfile.txt');
        if sl.count < 25 then exit;
        for lp := 19 to 24 do 
          memo1.add(SL[lp]);
      finally
        Sl.free;
      end;  
    end;
      

  2.   

    文本文件是只能顺序读取的文件,它以“行”为记录,行结尾为Char($0D)+Char($0A)即回车换行,文件结尾是Char($1B)即^Z,读文本文件只能从第一行开始依次向后读取,而Seek是对能够随机存取的文件进行定位,要求记录长度必须相同,才可以根据记录号计算出文件的相对位移。所以,此处用Seek出错。你可以先读出19个记录,接着再读的就是第20个记录(行)。注意,文本文件不能够读到结尾后再回来,而只能关闭后再打开后再从头读。
      

  3.   

    huojiehai(海天子)的方法也可以,但是有一个问题,就是如楼主所说的:text1文件太大,不能把text1全都放到memo控件里,要直从文件的第20行开始读,将整个text1文件放在SL: TStringlist中,是否有些奢侈了?如果你不在乎使用多一些的内存,这到也是个不错的办法。
      

  4.   

    本来在晚8点时就已经会复,可不知为什么,就是发不出去,CSDN怎么了?
      

  5.   

    多谢!!
    另外还有个小问题
    memo控件装载的文本字数是否有限制呢?谢谢
      

  6.   

    改:
    var file:textfile;
    i: integer;
        
       AssignFile(file, 'd:\mytextfile.txt');
       Reset(file);
       for i := 1 to 20 do
         readln();
    //    Seek(f, 20);//这句总是报错
       for i := 1 to 5 do
       begin
         readln(f, s);
         memo1.Lines.add(s);
       end