0

我在 Delphi 中保存不同的大型数据库类型时遇到问题。它包含一个 TItem 的数组 [1..3500],而 TItem 又包含两个数组 [1..50] 和 [1..20]。除非我将变量设置为指针并使用下面的 GetMem、FreeMem 命令,否则我会出现堆栈溢出,但是我无法保存它。代码如下。

procedure TDatabase.SaveDB;  
var  
 TempDB: ^TSaveDB;  
 K, X: integer;  
 sComment, sTitle, sComposer, sISDN, sCategory: string;  
begin  
GetMem(TempDB, SizeOf(TSaveDB));  

TempDB.CatCount := fCategoryCount;  
TempDB.ItemCount := fItemCount;  

for K := 1 to fCategoryCount do  
 TempDB.Categories[K] := fCategories[K];  

for K := 1 to fItemCount do  
 begin  
  fItems[K].ReturnSet(sTitle, sComposer, sCategory, sISDN, sComment);  
  with TempDB.Items[K] do  
   begin  
    Title := sTitle;  
    Composer := sComposer;  
    Category := sCategory;  
    ISDN := sISDN;  
   end;  

  TempDB.Items[K].Comments[1] := Copy(sComment, 1, 255);  
   Delete(sComment, 1, 255);  
  TempDB.Items[K].Comments[2] := Copy(sComment, 1, 255);  
   Delete(sComment, 1, 255);  
  TempDB.Items[K].Comments[3] := Copy(sComment, 1, 255);  
   Delete(sComment, 1, 255);  
  TempDB.Items[K].Comments[4] := Copy(sComment, 1, 255);  
   Delete(sComment, 1, 255);  

  TempDB.Items[K].KeyWCount := fItems[K].GetKeyCount;  

  for X := 1 to fItems[K].GetKeyCount do  
   TempDB.Items[K].Keywords[X] := fItems[K].GetKeywords(X);  
 end;

AssignFile(DBSave, fSaveName);  
 Rewrite(DBSave);  
  Write(DBSave, TempDB);  
Closefile(dBSave);  

FreeMem(TempDB, sizeof(TSaveDB));  
end;  
4

3 回答 3

3

使用 GetMem 或 SetLength 或 TList/TObjectList 并一次将一个 TSaveDB 写入文件。或者更改文件类型并使用 BlockWrite 一次将其全部写入。甚至更好:使用 TFileStream。

于 2009-03-30T17:01:38.160 回答
1

您的问题出在“写”语句中。用任意指针做事会导致各种奇怪的行为。如果你使用 TFileStream 而不是当前的方法重写它,你会容易得多。

于 2009-03-30T16:57:49.433 回答
1

扩展梅森的答案:

永远不要读或写指针,句号。要想从中获得任何合理的结果将需要很大的运气,而在现实世界中,当您不只是再次运行程序时,成功的几率会从无穷小降到零。

相反,您需要读取和写入指针指向的内容。

另请注意,任何长度未在声明中命名的字符串都是指针,除非您在使“字符串”变为“字符串 [255]”的兼容模式下运行——此模式的存在仅用于与非常当这是我们仅有的字符串时编写的旧代码。

由于您似乎只是将整个内容写出来,因此没有理由玩具有固定大小记录的游戏。只需将每个字段写入流,在写入字符串本身之前写入字符串的长度,以便您可以正确加载它。该文件将更小,并且没有任何内容被截断。

此外,正如他所说,使用 tFileStream。旧格式用于保留在磁盘上的记录文件,在这种情况下没有理由使用它。

于 2009-03-31T04:07:42.023 回答