Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.12;
Скачать: CL | DM;

Вниз

Поиск в файлах   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
1-36730
ased
2003-12-02 12:05
2003.12.12
Запуск exe для 1024x768 в 800x600


1-36741
AAA3AAA
2003-12-01 15:50
2003.12.12
хочу посоветоваться на счет алгоритма раскраски грида...


14-36837
eukar
2003-11-19 16:24
2003.12.12
DVD/CD-RW vs DVD + CD/RW


7-36874
Серж
2003-10-07 18:33
2003.12.12
Получить путь к выполняемой программе


4-36908
alexsc
2003-10-20 11:48
2003.12.12
добавить информацию о файле в структуру NTFS