在Delphi数据文件中搜索记录文件

时间:2014-03-03 18:18:55

标签: delphi

我正在创建一个程序,显示包含标题,作者和ISBN的10本书的列表。该程序可以显示记录并对它们进行排序,但我很难找到他。我不知道在哪里将FindArray标识符实现到代码中,我不知道如何让程序搜索本书。记录存储在.dat文件中。任何帮助,将不胜感激。这是代码:

 uses SysUtils;

 type TBook = Record

           Number : integer;
           Title : String[50];
           Author : String[50];
           ISBN : String[13];
         end;

 var Book : TBook;


CurrentFile : File Of TBook;

index : integer;
FindArray : array[1..10] of TBook;

Procedure Add_Book;

var Title, Author, ISBN : String;
index : integer;

begin
 Assign (CurrentFile, 'C:\Books.dat');
 reset (CurrentFile);
 Seek (CurrentFile, filesize(CurrentFile));
 Book.Number := (filepos(CurrentFile)+1);
 writeln ('Type in book title');
 readln (Title);
 For index := 1 to Length(Title) do
 Title[index] := Upcase(Title[index]);
 Book.Title := Title;
 writeln ('Type in author');
 readln (Author);
 For index := 1 to Length(Author) do
 Author[index] := Upcase(Author[index]);
 Book.Author := Author;
 writeln ('Type in ISBN');
 readln (ISBN);
 For index := 1 to Length(ISBN) do
 ISBN[index] := Upcase(ISBN[index]);
 Book.ISBN := ISBN;
 write (CurrentFile, Book);
 Close (CurrentFile);
 end;

 Procedure Show_All;
 begin
   Assign (CurrentFile, 'C:\Books.dat');
   reset (CurrentFile);
   while filepos(CurrentFile) <> filesize(CurrentFile) do
   begin
     read (CurrentFile, Book);
     writeln ('File: ', Book.Number);
     writeln ('Title: ', Book.Title);
     writeln ('Author: ', Book.Author);
     writeln ('ISBN: ', Book.ISBN);
     writeln;
  end;
 writeln;
 write ('END OF FILE!');
 readln;
 Close (CurrentFile);
 end;

Procedure Delete_All;
begin
  Assign (CurrentFile, 'C:\Books.dat');
  reset (CurrentFile);
  seek (CurrentFile,0);
  Truncate (CurrentFile);
  Close (CurrentFile);
end;

Procedure Menu;

var option :integer;

begin
  writeln ('Press appropriate number');
  writeln;
  writeln ('1. Search book');
  writeln ('2. Quit');
  readln (option);
  CASE option of
   1: show_all;
   2: delete_all
   else;menu
   end; {End Case}
end;

begin
  Assign (CurrentFile, 'C:\Books.dat');
  reset (CurrentFile);
  index := 0;
  while not eof(CurrentFile) do
  begin
    index := index+1;
    read (CurrentFile, Book);
  end;
  index := Book.Number;
  repeat
  menu
   until eof(CurrentFile);
   close (CurrentFile)
  end.

到目前为止,这是我的代码。我该怎么做才能搜索书名或作者?

1 个答案:

答案 0 :(得分:1)

如果我有一个所有使用相同基本结构的记录列表,并且我希望能够搜索它们并找到与某个过滤器模式匹配的记录,那么我要做的第一件事就是将它放入SQL数据库中而不是file of [record type]。然后我可以简单地运行一个查询:select * from BOOKS where TITLE = :title并让DBMS处理细节。

如果你不能这样做,有两种基本的方法来运行你自己的过滤:通过线性搜索和键查找。

它们都以相同的方式启动:将整个文件读入内存,转换为TBook数组。你接下来要做什么取决于你的策略。

线性搜索非常简单:

function FindBookIndex(const searchTitle: string): integer;
begin
   for i := 0 to high(bookArray) do
      if bookArray[i].Title = searchTitle then
         exit(i);
   result := -1; //not found
end;

索引搜索需要更多的工作,但实际运行搜索要快得多。您为整数(数组索引)设置了TDictionary映射字符串(标题)。然后运行查找,在字典上调用TryGetValue,如果没有结果则返回-1。请注意,这仅适用于完全匹配;如果你想进行部分匹配(例如,标题中包含单词“Wind”的书籍),你需要线性搜索或更复杂的索引方案。

但同样,最简单的方法是将其放入数据库中。