Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 093

/ вопрос открыт /

Здравствуйте!
Нашел функцию для поиска строк в файле, но не знаю как ей пользоваться.. Функция возвращает, не номер строки искомого, а какое то другое число.. не могу разобраться.. разъясните, пожалуйста.. как ей пользоваться? и как можно получить с помощью нее запрашиваемую строку..?

Приложение:
  1. function ScanFile(const FileName: string;
  2. const forString: string;
  3. caseSensitive: Boolean): Longint;
  4. { returns position of string in file or -1, if not found }
  5. const
  6. BufferSize = $8001; { 32K+1 bytes }
  7. var
  8. pBuf, pEnd, pScan, pPos: PChar;
  9. filesize: LongInt;
  10. bytesRemaining: LongInt;
  11. bytesToRead: Word;
  12. F: file;
  13. SearchFor: PChar;
  14. oldMode: Word;
  15. begin
  16. Result := -1; { assume failure }
  17. if (Length(forString) = 0) or (Length(FileName) = 0) then Exit;
  18. SearchFor := nil;
  19. pBuf := nil;
  20.  
  21. { open file as binary, 1 byte recordsize }
  22. AssignFile(F, FileName);
  23. oldMode := FileMode;
  24. FileMode := 0; { read-only access }
  25. Reset(F, 1);
  26. FileMode := oldMode;
  27. try { allocate memory for buffer and pchar search string }
  28. SearchFor := StrAlloc(Length(forString) + 1);
  29. StrPCopy(SearchFor, forString);
  30. if not caseSensitive then { convert to upper case }
  31. AnsiUpper(SearchFor);
  32. GetMem(pBuf, BufferSize);
  33. filesize := System.Filesize(F);
  34. bytesRemaining := filesize;
  35. pPos := nil;
  36. while bytesRemaining > 0 do
  37. begin
  38. { calc how many bytes to read this round }
  39. if bytesRemaining >= BufferSize then
  40. bytesToRead := Pred(BufferSize)
  41. else
  42. bytesToRead := bytesRemaining;
  43.  
  44. { read a buffer full and zero-terminate the buffer }
  45. BlockRead(F, pBuf^, bytesToRead, bytesToRead);
  46. pEnd := @pBuf[bytesToRead];
  47. pEnd^ := #0;
  48. { scan the buffer. Problem: buffer may contain #0 chars! So we
  49. treat it as a concatenation of zero-terminated strings. }
  50. pScan := pBuf;
  51. while pScan < pEnd do
  52. begin
  53. if not caseSensitive then { convert to upper case }
  54. AnsiUpper(pScan);
  55. pPos := StrPos(pScan, SearchFor); { search for substring }
  56. if pPos <> nil then
  57. begin { Found it! }
  58. Result := FileSize - bytesRemaining +
  59. Longint(pPos) - Longint(pBuf);
  60. Break;
  61. end;
  62. pScan := StrEnd(pScan);
  63. Inc(pScan);
  64. end;
  65. if pPos <> nil then Break;
  66. bytesRemaining := bytesRemaining - bytesToRead;
  67. if bytesRemaining > 0 then
  68. begin
  69. { no luck in this buffers load. We need to handle the case of
  70. the search string spanning two chunks of file now. We simply
  71. go back a bit in the file and read from there, thus inspecting
  72. some characters twice
  73. }
  74. Seek(F, FilePos(F) - Length(forString));
  75. bytesRemaining := bytesRemaining + Length(forString);
  76. end;
  77. end; { While }
  78. finally
  79. CloseFile(F);
  80. if SearchFor <> nil then StrDispose(SearchFor);
  81. if pBuf <> nil then FreeMem(pBuf, BufferSize);
  82. end;
  83. end; { ScanFile }
  84.  
  85.  


Makarenko Vladimir Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Feniks (статус: Бакалавр), 17 ноября 2008, 13:31 [#2]:

Правильно чувствуешь, Вадик. ;-) Я с тобой согласен, изходя из:
if pPos <> nil then  
begin { Found it! } 
    Result := FileSize - bytesRemaining + Longint(pPos) - Longint(pBuf); 
    Break; 
end;
Makarenko Vladimir

Makarenko Vladimir (статус: Посетитель), 17 ноября 2008, 16:17 [#3]:

ну ребят, я еще маловат, вы мне объясните, её можно как нить использовать, чтобы получить искомою строку в файле, или хотяб ее номер,заранее спасибо.
Makarenko Vladimir

Makarenko Vladimir (статус: Посетитель), 17 ноября 2008, 16:22 [#4]:

точнее получить стоку, в которой имеется искомое слово...
Nasgool

Nasgool (статус: 2-ой класс), 18 ноября 2008, 13:20 [#5]:

Для использования этой функции начни работать не с TTextFile, а c TFileStream.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 2 апреля 2020, 04:06
Выполнено за 0.03 сек.
Рейтинг@Mail.ru