Форум: "Основная";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
ВнизSearch in file Найти похожие ветки
← →
ed_209 (2002-06-07 02:07) [0]Нашел такую функцию на torry.net, она ищет строку в файле, но возвращает только позицию первой найденной строки. Кто-нибудь знает, как сделать, чтобы получить все позиции?
function ScanFile(Const filename: String; Const forString: String; caseSensitive: Boolean): LongInt;
const
BufferSize= $8001;
var
pBuf, pEnd, pScan, pPos: Pchar;
filesize: LongInt;
bytesRemaining: LongInt;
bytesToRead: Integer;
F: File;
SearchFor: Pchar;
oldMode: Word;
begin
Result := - 1;
if (Length( forString ) = 0) or (Length( filename ) = 0) then
Exit;
SearchFor := Nil;
pBuf := Nil;
AssignFile( F, filename );
oldMode := FileMode;
FileMode := 0;
Reset( F, 1 );
FileMode := oldMode;
try
SearchFor := StrAlloc( Length( forString ) + 1 );
StrPCopy( SearchFor, forString );
if not caseSensitive then
AnsiUpper( SearchFor );
GetMem( pBuf, BufferSize );
filesize := System.Filesize( F );
bytesRemaining := filesize;
pPos := Nil;
while bytesRemaining > 0 do
begin
if bytesRemaining >= BufferSize then
bytesToRead := Pred( BufferSize )
else
bytesToRead := bytesRemaining;
BlockRead( F, pBuf^, bytesToRead, bytesToRead );
pEnd := @pBuf[ bytesToRead ];
pEnd^:= #0;
pScan := pBuf;
while pScan < pEnd do
begin
if not caseSensitive then
AnsiUpper( pScan );
pPos := StrPos( pScan, SearchFor );
if pPos <> Nil then
begin
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
Seek( F, FilePos(F) - Length( forString ));
bytesRemaining := bytesRemaining + Length( forString );
end;
end;
finally
CloseFile( F );
if SearchFor <> Nil then
StrDispose( SearchFor );
if pBuf <> Nil then
FreeMem( pBuf, BufferSize );
end;
end;
← →
Voldemar (2002-06-07 02:55) [1]А зачем все позиции? Длина строки-то известна...
Позиция конца строки будет такая:
ScanFile("filename.ext", Str, false)+Length(str)
← →
ed_209 (2002-06-07 03:25) [2]Мне не совсем это нужно... Допустим, в файле строка "string" встречается 3 раза - 5, 28, 1045 байт от начала файла. Данная функйия возвратит 5. Мне нужно получить также и 28 и 1045.
← →
Voldemar (2002-06-07 03:47) [3]Тогда только поменять строку в файле и функцию заново вызвать. Или вставить дополнительный параметр - какую по счету позицию показывать и дополнить функцию...
← →
esVer (2002-06-07 09:39) [4]>Кто-нибудь знает, как сделать, чтобы получить все позиции?
Переписать ф-цию. Пусть она возвращает TList. Если тебе нужен список всех позиций - не делай break после первого найденного слова, а заноси его в TList. И так пока файл не кончится.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c