Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.004 c
1-65078
Magic
2002-05-28 15:26
2002.06.20
Свойство Font в StringGrid.


1-65121
systematic
2002-06-06 22:42
2002.06.20
Рисовать курсором на форме?


6-65193
Novichok-Lamer
2002-04-10 20:53
2002.06.20
Несложный вопрос...


3-64939
ikos
2002-05-27 11:08
2002.06.20
character set в IB 6.0 Срочно!!!


14-65234
BJValentine
2002-05-18 13:25
2002.06.20
Попандос, помогите





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский