【问题标题】:Store strings in binary file while keeping them alphabetically sorted将字符串存储在二进制文件中,同时保持它们按字母顺序排序
【发布时间】:2019-11-19 19:18:56
【问题描述】:

所以,假设我有一个将字符串存储到二进制文件中的 C 程序。并且在另一个二进制文件中,保存了每个字符串的第一个字节的位置。

例如。 words.bin 包含:alphacardelta

并且 pos.bin 包含:0 5 8

我想插入“beta”,让它在 alpha 和 car 之间切换。虽然我已经知道如何在 alpha 之后插入它,但我无法找到一种自动方式将它插入到正确的位置,并且不会导致任何其他单词在可能很长的列表中“消失”。有什么帮助吗?

我认为另一种可行的方法(可能更好)是在 delta 之后插入 beta,然后重新排序,但我的尝试也失败了。

任何帮助表示赞赏。

【问题讨论】:

  • 到目前为止你发现了什么
  • @user253751 如答案所述,如何在它应该去的词之后插入它。有时它运作良好,有时它会在尝试“移动它们”时覆盖其他单词。我没有发布任何代码的原因是我不断地改变它试图弄清楚所以我必须每 5 分钟更新一次。我已将此作为起点,因为它不需要代码即可理解。
  • @user253751 如果可能的话,我更喜欢用第二种方式完成(在最后插入后重新排序),但我在那里取得的进展为零
  • 为什么要直接在文件里做这个?使用合适的数据结构,允许快速插入并实现对文件的读取和写入。从文件中读取数据,根据需要进行更新,如果已更改,则存储更改的数据。
  • 你能弄清楚如何在内存中而不是在文件中执行此操作吗?

标签: c sorting binaryfiles binary-search


【解决方案1】:

我想插入“beta”,让它在 alpha 和 car 之间切换。

要在文件中执行此操作,您需要再次将数据写入文件。

这里有两种方法。

  1. 将文件中的所有数据读入内存 (RAM)。您可以使用数组或结构。
  2. 将正确位置的附加数据添加到内存中。
  3. 再次写入整个文件。作为一种优化,您可以从更改的位置写入到末尾。

你也可以

  1. 将文件中的所有数据读入内存 (RAM)。在这里您可以读取整个数据或以合适的块读取以减少内存使用。
  2. 使用附加数据创建一个新文件
  3. 写入这个新文件。
  4. 最后您可以删除旧文件并重命名新文件。

这是一个非常低效的操作,如果您尝试找到一种仅将新数据添加到文件末尾(追加)的方法会更好。您可以在开头保留某种数据索引,以了解字符串的位置以及它是否被删除。

【讨论】:

  • 如果您想使用更少的内存,您可以通过一次读取和写入文件的一部分来直接插入文件。会更难。
  • @user253751 我想我将尝试阅读 alpha,发现它必须在 alpha 之后进行,存储或以某种方式保存 cardelta,然后从文件中删除它们,然后附加 beta ,然后再次附加 cardelta 。并且只是将 pos.bin 中的位置增加 beta 的长度。这效率低吗?
  • @iRaspberryPi - 因为你已经在pos.bin 文件中有一个索引,你总是可以在最后写入主文件。然后你可以对位置进行排序,每次只重写pos.bin文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2016-12-05
  • 2018-11-20
  • 2021-05-08
相关资源
最近更新 更多