如何写入文件的开头并插入而不是覆盖数据?

时间:2014-04-20 17:00:07

标签: pascal freepascal lazarus

Pascal中有没有办法写入文件的开头,而不会覆盖其他数据?

我已经学会了Seek(F, 0);,但这会覆盖文件中的第一件事。

4 个答案:

答案 0 :(得分:1)

无法插入文件。您只能覆盖或追加。因此,如果您想使用简单的线性文件自己完成,那么您需要重新编写整个文件。如果您的文件很大,那么这是相当没有吸引力的。

解决问题的一种显而易见的方法是使用本地数据库,而不是编写自己的文件处理机制。数据库层为您管理索引,以便您可以避免昂贵的整个文件重写。

当然,如果您的文件很小并且您不关心性能,那么您可以轻松地解决问题。此配方显示如何将记录插入文件中的i位置。对于您在开始时插入的既定目标,i将为零。

  • 然后将整个文件读入N条记录数组。
  • 将第一个i记录写回文件。
  • 将插入的记录写回文件。
  • 将剩余的N-i原始记录写回文件。

答案 1 :(得分:1)

您无法在现有数据前插入新数据。写入文件的开头/中间始终会覆盖现有数据,您无法更改。您唯一的选择是创建一个新文件,首先将新数据写入其中,然后将现有文件的内容附加到新文件,最后用新文件替换现有文件。

答案 2 :(得分:1)

您可以使用以下算法实现目标:

  • 创建临时文件;
  • 将新数据写入此临时文件;
  • 从目标文件中读取所有数据并将其附加到临时文件中;
  • 将临时文件重命名为目标文件;

答案 3 :(得分:0)

此变体。

procedure InsertFile(const aFile, aLine: String);
var
  vList: TStringList;
begin
  vList:= TStringList.Create;
  try
    vList.LoadFromFile(aFile);
    vList.Insert(0, aLine);
    vList.SaveToFile(aFile);
  finally
    vList.Free;
  end;
end;

但同样有限。对于大文件,当整个文件加载到内存中时,它会很慢。