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

Pascal 如何写入文件开头并插入而不是覆盖数据?,pascal,freepascal,lazarus,Pascal,Freepascal,Lazarus,在Pascal中有没有一种方法可以在不覆盖其他数据的情况下写入文件的开头 我已经学会了Seek(F,0)但这会覆盖文件中的第一项内容。无法插入到文件中。您只能覆盖或追加。因此,如果您想自己使用一个简单的线性文件,那么您需要重新编写整个文件。如果您的文件很大,那么这是相当不吸引人的 解决问题的一个明显方法是使用本地数据库,而不是编写自己的文件处理机制。数据库层为您管理索引,以便您可以避免昂贵的整个文件重写 当然,如果您的文件很小,并且您不关心性能,那么您就可以很容易地解决问题。此配方显示如何将记录

在Pascal中有没有一种方法可以在不覆盖其他数据的情况下写入文件的开头


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

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

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

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

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

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

您可以通过以下算法实现目标:

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

      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;
      

      但也有同样的局限性。对于大文件,当整个文件加载到内存中时速度会很慢。

      准确地说,
      seek()
      本身不会覆盖任何内容,它只是将当前文件操作指针设置为文件的开头。文件有多大。对于大文件,您建议的解决方案具有非常好的性能特征。您所说的“第一个i”记录和“插入的记录”是什么意思?这是在位置
      i
      插入记录的方法。如果要在任何其他文件之前插入,则
      i
      具有值
      0
      。我很怀疑你是否真的想这么做。我强烈怀疑你对你的问题有错误的解决方案。基本上我想按照鲍里斯的建议去做,但是我在阅读所有的记录时遇到了麻烦。出于某种原因,它目前只读取一条记录。好吧,所有三个答案都说了同样的话。鲍里斯的建议与其他答案完全相同。如果你不知道如何读写文件,那就从这里开始。当您可以这样做时,请转到插入。你是在乎性能,还是不管你尝试的是什么都会表现得很糟糕。首先,你应该阅读一本教科书,或者一些文档,或者一本关于如何进行pascal io的教程。然后,当你陷入困境时,用简单的代码提问。你也应该在适当的时候在这里接受答案。根据您的判断选择最好的。插入(1,aLine)?它应该是Insert(0,aLine):您希望aLine是第一行(索引0),Insert方法的索引始终引用插入该行之前的索引。好的,您是正确的。我从生产代码中复制了它,在这种情况下,我想保留第一行。