如何分段读入txt文件?(100)

  • 主题发起人 主题发起人 warket
  • 开始时间 开始时间
W

warket

Unregistered / Unconfirmed
GUEST, unregistred user!
比如说我有一个很大的TXT文件(比如说小说),我想我的程序里面能够分段读入那么应该怎么做呢?并想要能够翻页,就是说可以读取文本文件中如何我想要的位置的文字!另外怎么知道我到底读入多少字?换句话说就是一本书,读入的是多少字,我只要充满一页那么其他的就是下一页,然后下面的就是从下一页开始!
 
用 TFileStream 来读取,应该可以吧。只要找出 分段 标记就好办了, 具体没做过```
 
读取行,一页几行readln
 
TStringList
 
TStringList
 
你说的问题,我刚好前几天遇到了。以下经我亲手测试:FileStream虽然是不错的方法,但是存在乱码的问题,而且内存占用较多。StringList虽然是不错的方法,但是大文件慢的很。ReadLn是不错的方法,不出现乱码,内存占用小,而且速度很快。你读取多少是你自己说了算,但是用ReadLn只能一行一行读取,一行是指由回车和换行的地方可以认为是一行,否则读取的数据大约是4K左右。例如你要生成一页的文字大小是10K,那么,你通过ReadLn分多次读取,直到读出的数据大于10K,剩下的就是下一页循环的问题了。根据我的测试,你要读取一个10K左右的文档,一般来说读到的数据是11K左右。而且你用同样的方法,分割同一个文件,每次分割出的文件都是相同的看看我的代码,希望有帮助:procedure TFrmMain.BtnRunClick(Sender: TObject);var StrFile: string; FileSize: integer; CutSize: integer; i, Residual: integer; StrFileName, StrFilePath: string; RealSize: integer; SourTxt, DestTxt: TextFile; s: string;begin StrFile := EdtFile.Text; if Trim(StrFile) = '' then begin State := '请先选择一个Txt类型的文件'; Exit; end; if Trim(EdtFileSize.Text) = '' then begin State := '不能获取所选文件的大小'; Exit; end; try FileSize := StrToInt(EdtFileSize.Text); CutSize := StrToInt(EdtCutSize.Text); except State := '不正确的文件大小'; Exit; end; //所选文件不可超过100M if FileSize > 100 * 1023 then begin State := '所选择的文件太大,不被支持'; Exit; end; //所选文件太小,不分割 if FileSize < 50 then begin State := '所选择的文件太小,不需要分割'; Exit; end; //分割的文件大小不得超过1M if (CutSize < 50) or (CutSize > 1024) then begin State := '不正确的分割文件大小'; Exit; end; StrFileName := ExtractFileName(StrFile); StrFileName := ChangeFileExt(StrFileName, ''); StrFilePath := ExtractFilePath(StrFile) + StrFileName + '//'; if not DirectoryExists(StrFilePath) then CreateDir(StrFilePath); State := '正打开文件...'; AssignFile(SourTxt, StrFile); ReSet(SourTxt); Run := true; i := 1; while (not Eof(SourTxt)) and Run do begin State := '正生成第【' + IntToStr(i) + '】个文件...'; StrFile := StrFilePath + StrFileName + IntToStr(i) + '.txt'; if FileExists(StrFile) then DeleteFile(StrFile); AssignFile(DestTxt, StrFile); ReWrite(DestTxt); Residual := 0; while (Residual < CutSize * 1024) and (not Eof(SourTxt)) do begin s := ''; ReadLn(SourTxt, s); if s = '' then continue; RealSize := Length(s); WriteLn(DestTxt, s); Residual := Residual + RealSize; end; CloseFile(DestTxt); inc(i); end; CloseFile(SourTxt); if Run then State := '文件分割完毕,共创建【' + IntToStr(i - 1) + '】个文件...' else State := '用户停止分割文件...'; Run := false;end;
 
使用 CreateFile(); ReadFile(); SetFilePointer() 比较好,速度快,内存占用少,想读多少读多少: hFile := CreateFile(PChar(FileName), 0, 0, nil, OPEN_EXISTING, 0, 0); //打开 ReadFile(hFile, Pointer(str)^, nReadSize, ..); //读取 SetFilePointer(hFile,...) //设置指针位置 具体使用看SDK帮助
 
我认为 smlabc 的方法存在读出乱码的问题。
 
为什么会出现乱码?汉字是2个字符,读到最后一个只读了1半就是乱码,转到WideString就处理了,而且读到1024,下次开始可以从1023开始,这些都是处理的小技巧
 
多人接受答案了。
 
后退
顶部