Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
ВнизПоиск в файлах Найти похожие ветки
← →
vlv (2003-11-29 20:52) [0]Есть ли какие-нибудь стандартные решения для поиска строки в файлах (в указанной директории)?
← →
Anatoly Podgoretsky (2003-11-29 21:09) [1]Да, Win+F/Ctrl+F
← →
me (2003-11-29 21:19) [2]Microsoft Indexing Server
← →
vlv (2003-12-01 16:08) [3]=)) Ctrl+F - это прикольно.
Имелось в виду вызвать из кода программы.
← →
Clift (2003-12-01 16:18) [4]я так делал
если нужно найти строку "qwe"
str:="dddddd qwe dddddd";
if pos("q" str)<>0 then
begin
if pos("w",str)=pos("q", str)+1 then
begin
if pos("e")=pos("q",str)+2 then такая строка есть.....
end;
end;
уверен что есть другой способ но и этот работает
← →
Anatoly Podgoretsky (2003-12-01 16:20) [5]Если стандартные решения и в программе, то смотри местный чаво
← →
Eugene1501 (2003-12-01 19:02) [6]То Clift А чем тебе так не понравилось?
if pos("qwe",str)<>0 then такая строка есть.....
← →
zapped (2003-12-02 02:44) [7]а кто-нибудь думал над тем, что в общем случае в файле могут содержаться нулевые символы?
← →
panov (2003-12-02 09:33) [8]>zapped © (02.12.03 02:44) [7]
а кто-нибудь думал над тем, что в общем случае в файле могут содержаться нулевые символы?
А зачем?
Для Pos совершенно без разницы, есть нулевой символ или нет.
← →
Anatoly Podgoretsky (2003-12-02 09:37) [9]zapped © (02.12.03 02:44) [7]
Ну думали, ну и что, правильнее думать, что в файле могут встретиься все допустимые комбинации символов, от 0 до 255. Но зачем тогда говорить о строках? Говорить тогда надо о поиске вдоичных данных. Pos с ними тоже справляется.
← →
alena.svt (2003-12-02 10:12) [10]Function ScanFile( Const filename: String;
Const forString: String;
caseSensitive: Boolean ): LongInt;
{ returns position of string in file or -1, if not found }
Const
BufferSize= $8001; { 32K+1 bytes }
Var
pBuf, pEnd, pScan, pPos : Pchar;
filesize: LongInt;
bytesRemaining: LongInt;
bytesToRead: Word;
F : File;
SearchFor: Pchar;
oldMode: Word;
Begin
Result := -1; { assume failure }
If (Length( forString ) = 0) or (Length( filename ) = 0) Then Exit;
SearchFor := Nil;
pBuf := Nil;
{ open file as binary, 1 byte recordsize }
AssignFile( F, filename );
oldMode := FileMode;
FileMode := 0; { read-only access }
Reset( F, 1 );
FileMode := oldMode;
try { allocate memory for buffer and pchar search string }
SearchFor := StrAlloc( Length( forString )+1 );
StrPCopy( SearchFor, forString );
If not caseSensitive Then { convert to upper case }
AnsiUpper( SearchFor );
GetMem( pBuf, BufferSize );
filesize := System.Filesize( F );
bytesRemaining := filesize;
pPos := Nil;
While bytesRemaining > 0 Do Begin
{ calc how many bytes to read this round }
If bytesRemaining >= BufferSize Then
bytesToRead := Pred( BufferSize )
Else
bytesToRead := bytesRemaining;
{ read a buffer full and zero-terminate the buffer }
BlockRead( F, pBuf^, bytesToRead, bytesToRead );
pEnd := @pBuf[ bytesToRead ];
pEnd^:= #0;
{ scan the buffer. Problem: buffer may contain #0 chars! So we
treat it as a concatenation of zero-terminated strings. }
pScan := pBuf;
While pScan < pEnd Do Begin
If not caseSensitive Then { convert to upper case }
AnsiUpper( pScan );
pPos := StrPos( pScan, SearchFor ); { search for substring }
If pPos <> Nil Then Begin { Found it! }
Result := FileSize - bytesRemaining +
LongInt( pPos ) - LongInt( pBuf );
Break;
End;
pScan := StrEnd( pScan );
Inc( pScan );
End;
If pPos <> Nil Then Break;
bytesRemaining := bytesRemaining - bytesToRead;
If bytesRemaining > 0 Then Begin
{ no luck in this buffers load. We need to handle the case of
the search string spanning two chunks of file now. We simply
go back a bit in the file and read from there, thus inspecting
some characters twice
}
Seek( F, FilePos(F)-Length( forString ));
bytesRemaining := bytesRemaining + Length( forString );
End;
End; { While }
finally
CloseFile( F );
If SearchFor <> Nil Then StrDispose( SearchFor );
If pBuf <> Nil Then FreeMem( pBuf, BufferSize );
end;
end; { ScanFile }
Peter Below (TeamB) 100113.1101@compuserve.com)
No e-mail responses, please, unless explicitly requested!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c