读普通文本文件,使用这个方法能按行读取:
assignfile(fp,editMarcFileTntEdit.Text);
      reset(fp);
      Readln(
      readln(fp,   str);
但如果读特殊字符,读完就成乱码了.
  MarcList := TWideStringList.Create;
  MarcList.LoadFromFile(editMarcFileTntEdit.Text);
  MarcList.Text := WideStringReplace(MarcList.Text,'#$1D',#13#10,[rfReplaceAll]);使用这个方法读特殊字符,读完的结果非常正确. 但他不能按行读取, 文件非常大,必须一点一点读.疑问:如何能按行读取特殊字符文件.

解决方案 »

  1.   

    MarcList.load完文件
    用一个循环一行行读
    for i:=0 to MarcList.count-1 do
    begin
    end; 
      

  2.   

    MarcList.load完文件,用这个读完文件就天亮了, 需要1行1行读. 
      

  3.   

    BlockRead?? buf可以用一个widechar的数组
    虽然不是逐行读但是一点一点读,如果一定需要判断行数可以判断是否读到换行符
      

  4.   

    请问能否把用readln(fp,  str); 读到的乱码转化为 正确的字符串呢?
      

  5.   

    //网上的资料,希望对你有帮助。
    Delphi读写UTF-8、Unicode格式文本文件
    在研究PvPGN时发现conf配置文件一些为UTF-8和Unicode格式,这样便可良好的支持多语言,从网上查阅资料后,将读写UTF-8、Unicode文件写了几个最精简的函数,更新后加了是否写文件头的功能,以适应更多需要,注意函数未加防错保护。参数说明:f文件名、s写入或读取的文件内容、hs文件头、b是否读写文件头。UTF-8文件写入函数
    程序代码 程序代码
    procedure SaveUTF(f:string;s:string;b:boolean=true);
    var
      ms:TMemoryStream;
      hs:String;
    begin
      if s='' then exit;
      ms:=TMemoryStream.Create;
      if b then begin
        hs:=#$EF#$BB#$BF;
        ms.Write(hs[1],3);
      end;
      s:=AnsiToUtf8(s);
      ms.Write(s[1],Length(s));
      ms.Position:=0;
      ms.SaveToFile(f);
      ms.Free;
    end;
    UtF-8文件读取函数
    程序代码 程序代码
    function LoadUTF(f:string;b:boolean=true):string;
    var
      ms:TMemoryStream;
      s,hs:string;
    begin
      Result:='';
      if not FileExists(f) then exit;
      ms:=TMemoryStream.Create;
      ms.LoadFromFile(f);
      if b then begin
        SetLength(hs,3);
        ms.Read(hs[1],3);
        if hs<>#$EF#$BB#$BF then begin ms.Free; exit; end;
        SetLength(s,ms.Size-3);
        ms.Read(s[1],ms.Size-3);
      end else begin
        SetLength(s,ms.Size);
        ms.Read(s[1],ms.Size);
      end;
      Result:=Utf8ToAnsi(s);
      ms.Free;
    end;
    Unicode文件写入函数
    程序代码 程序代码
    procedure SaveUnicode(f:string;s:string;b:boolean=true);
    var
      ms:TMemoryStream;
      hs:string;
      ws:WideString;
    begin
      if s='' then exit;
      ms:=TMemoryStream.Create;
      if b then begin
        hs:=#$FF#$FE;
        ms.Write(hs[1],2);
      end;
      ws:=WideString(s);
      ms.Write(ws[1],Length(ws)*2);
      ms.Position:=0;
      ms.SaveToFile(f);
      ms.Free;
    end;
    Unicode文件读取函数
    程序代码 程序代码
    function LoadUnicode(f:string;b:boolean=true):string;
    var
      ms:TMemoryStream;
      hs:String;
      ws:WideString;
    begin
      Result:='';
      if not FileExists(f) then exit;
      ms:=TMemoryStream.Create;
      ms.LoadFromFile(f);
      if b then begin
        SetLength(hs,2);
        ms.Read(hs[1],2);
        if hs<>#$FF#$FE then begin ms.Free; exit; end;
        SetLength(ws,(ms.Size-2) div 2);
        ms.Read(ws[1],ms.Size-2);
      end else begin
        SetLength(ws,ms.Size div 2);
        ms.Read(ws[1],ms.Size);
      end;
      Result:=AnsiString(ws);
      ms.Free;
    end;
      

  6.   

    //9楼的内容希望对你有帮助
    http://topic.csdn.net/t/20050906/12/4252388.html
      

  7.   

    MyData: array[1..2048] of WideChar;AssignFile(F, editMarcFileTntEdit.Text);
          Reset(F);
          i:=1;
          BlockRead(F, MyData, 5, BytesRead);
          while (True) do
            begin
              str:=WideStringOfChar(MyData[i],1);
              if str=#$D then
              begin
                str2:=WideStringOfChar(MyData[i+1],1);
                if str2=#$A then
                begin//说明读到回车了,准备换行,读下一行.
                  i:=i+2;
                  //开始换行,把这行数据转化为marc,保存到数据库,然后读下一行文本.
                end
                else
                begin
                  widestr:=widestr+str;
                  i:=i+1;
                end;
              end
              else
              begin
                widestr:=widestr+str;
                i:=i+1;
              end;
            end;
          end;
    我按照3楼的说法试了一下,可以,但感觉一个子一个字读,太慢,留下一个缺陷,以后再解决吧,
    目前先用1楼的方法,只能读小文件,读不了11M的文件.5,6楼的内容一时看不懂,以后有时间再研究.
      

  8.   

    你可以用 BUFFER. 设定一次读1024BYTE这样也行啊.