写一个 字符串查找 程序(100)

  • 主题发起人 主题发起人 gfwlxx
  • 开始时间 开始时间
G

gfwlxx

Unregistered / Unconfirmed
GUEST, unregistred user!
要求: 和dos里的find,findstr命令一样 查找单个,or 多个字符串 从一个文本思路:查找功能实现当然是最简单的posex拉,问题是如何把文本读入内存? 我设计了几个思路 1. readln 逐行读取 //嘿嘿,管你文件多大,我不站内存而且很稳定 hoho 似乎对回车以后的 分开的字符串查找不到 2. 载入 loadform tstrlist后,for+pos or indexof //文件大小有限制 太大导致内存崩溃 3. 在2的基础上,设置一个文件分割读取的函数,设置每次读取的大小,就是分块处理 //但是问题是分割点有那个要查找的字符串就惨了,还有 如何实现文件分割读取? 我还不会 4. 批量查询我还没有想好怎么查, 我的笨方法就是一个pos完了下一个pos 呵呵5...n 众人给想就这么个文件 findx.exe 查找功能之余还要实时 free内存因为微软的find findstr 内存管理不好,我进行几万次文件查找之后回内存崩溃,‘系统资源不足,无法。。。。’ 然后所有程序都运行不料 只能重启。。 大侠,您出马的时候到了!
 
你打开完文件后,可以把文件全部内容,一次性全部拷贝到一个String类型的变量,然后再用pos函数。我以前就是这么处理的。
 
先读到FileStream里,从里面读一部分到string(大小自己定,如1024).pos..完了,再读下一个部分,从1024-Length(SubStr)到 2048-Length(SubStr),SubStr为你想查找的字符串,依次类推
 
就用pos吧 先把字符串存进某个地方 然后pos
 
smlabc 正解``只是要注意字符分割处, 如// 返回 第一次查找到 ASubStr 子符所在文件流位置, 没找到返回 0function FindStr(const AFileName: string; const ASubStr: string; const AStartSearchPos: Int64 = 1): Int64;const ReadBlockSize: Integer = 1024;var iSubStrLen: Integer; n: Integer; FileStream: TFileStream; Buffer: string; // array of Char; iLeaveSize: Int64; iBufferLen: Integer; iPos: Integer;begin Result := 0; iSubStrLen := Length(ASubStr); n := iSubStrLen div ReadBlockSize + 1; // ReadBlockSize * n 保证 > iSubStrLen FileStream := TFileStream.Create(AFileName, fmShareDenyWrite); try FileStream.Position := AStartSearchPos; iLeaveSize := FileStream.Size - FileStream.Position; while iLeaveSize >= iSubStrLen do begin iBufferLen := ReadBlockSize * n; if iBufferLen > iLeaveSize then iBufferLen := iLeaveSize; SetLength(Buffer, iBufferLen); // 读取 iBufferLen 大小到 Buffer if FileStream.Read(Buffer, iBufferLen) < iSubStrLen then Break;// if StrPos(PChar(Buffer), PChar(@ASubStr[1])) <> nil then iPos := Pos(ASubStr, Buffer); if iPos > 0 then begin Result := FileStream.Position + iPos; Break; end else begin // 回退 子串长度减一位 FileStream.Position := FileStream.Position - (iSubStrLen -1); end; iLeaveSize := FileStream.Size - FileStream.Position; end; finally FileStream.Free; end;end;// 没有验证``
 
代码还没细看,光凭你能给出代码,这分 我给你
 
后退
顶部