|
Вопрос # 2 093/ вопрос открыт / |
|
Здравствуйте!
Нашел функцию для поиска строк в файле, но не знаю как ей пользоваться.. Функция возвращает, не номер строки искомого, а какое то другое число.. не могу разобраться.. разъясните, пожалуйста.. как ей пользоваться? и как можно получить с помощью нее запрашиваемую строку..?
Приложение: Переключить в обычный режим- 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 }
-
-
 |
Вопрос задал: Makarenko Vladimir (статус: Посетитель)
Вопрос отправлен: 17 ноября 2008, 11:41
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Почитал форум.
Цитата:
точнее получить стоку, в которой имеется искомое слово...
Приведённая функция ищет строку в ЛЮБОМ файле, не только текстовом, и возвращает адрес начала этой строки.
Если у тебя файл текстовый и требуется найти номер строки, в которой встречается искомый набор символов (условно - слово), то есть способ проще.
// Ищем в файле строку, где встречается слово S. Если такая строка найдена,
// то она возвращается в параметре Found, а функция возвращает номер этой строки
// в файле или -1, если не найдено.
// Вариант для Delphi:
function FindWordInFile(const FileName, S: string; var Found: string): Integer;
var
List: TStringList;
Index: Integer;
begin
Result:= -1;
if not FileExists(FileName)
then Exit;
List:= TStringList.Create();
try
for Index:= 0 to List.Count - 1 do
if Pos(S, List[Index]) <> 0
then begin
Result:= Index;
Found:= List[Index];
Break;
end;
finally
List.Free();
end;
end;
// Вариант для Borland Pascal 7.0
function FindWordInFile(const FileName, S: string; var Found: string): LongInt;
var
Index: LongInt;
F: Text;
Temp: string;
begin
FindWordInFile:= -1;
Index:= 0;
Assign(F, FileName);
{$i-}
Reset(F);
while not Eof(F) do
begin
ReadLn(F, Temp);
if Pos(S, Temp) <> 0
then begin
FindWordInFile:= Index;
Found:= Temp;
Break;
end;
Inc(Index);
end;
Close(F);
{$i+}
if IOResult <> 0
then FindWordInFile:= -1;
end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 ноября 2008, 18:37
Оценка за ответ: 5
Комментарий к оценке: Спасибо! огромное!
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 18 ноября 2008, 13:20; участников в обсуждении: 4.
|
Вадим К (статус: Академик), 17 ноября 2008, 11:50 [#1]:
Чувствую, что функция возвращает номер символа, точнее байта в файле, где найдена строка.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Feniks (статус: Бакалавр), 17 ноября 2008, 13:31 [#2]:
Правильно чувствуешь, Вадик. Я с тобой согласен, изходя из:
if pPos <> nil then
begin { Found it! }
Result := FileSize - bytesRemaining + Longint(pPos) - Longint(pBuf);
Break;
end;
|
|
Makarenko Vladimir (статус: Посетитель), 17 ноября 2008, 16:17 [#3]:
ну ребят, я еще маловат, вы мне объясните, её можно как нить использовать, чтобы получить искомою строку в файле, или хотяб ее номер,заранее спасибо.
|
|
Makarenko Vladimir (статус: Посетитель), 17 ноября 2008, 16:22 [#4]:
точнее получить стоку, в которой имеется искомое слово...
|
|
Nasgool (статус: 2-ой класс), 18 ноября 2008, 13:20 [#5]:
Для использования этой функции начни работать не с TTextFile, а c TFileStream.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|