【问题标题】:Good way to save data when writing a text editor编写文本编辑器时保存数据的好方法
【发布时间】:2011-01-25 04:04:25
【问题描述】:

我打算用 c 做一个文本编辑器。所以只是想知道什么数据结构好保存文本。我读到使用链表是一种方法,但效率不高。请向我指出一些参考资料,在那里我可以很好地了解需要使用什么。我打算使用 ncurses 库来获取用户输入并捕获键和 UI。

使用现有编辑器的源代码有点过于复杂,所有的文本编辑器都非常庞大,甚至是仅控制台的编辑器。任何简单的控制台编辑器源代码供参考?

【问题讨论】:

  • 您的意思似乎是一种存储数据的好方法,因为保存它是指将其写入文件(这不也不应该涉及任何数据结构)你的程序)。 (不过是个好问题。)
  • 哇...我昨天只是在想这个问题。 +1 阅读我的想法。
  • 您可以查看ed(标准文本编辑器)。 ed 是面向行的,它的内部结构应该非常简单。对于那些有幽默感的人:gnu.org/fun/jokes/ed.msg.html

标签: c data-structures programming-languages


【解决方案1】:

您将受益于reading about Emacs buffers。另请参阅this blog,尤其是最后一条评论,此处引用以方便参考:

包括 GNU 在内的许多 Emacs 版本都使用一个连续的字符数组,该数组实际上分为两个部分,由一个间隙隔开。插入间隙首先移动到插入点。插入的字符填充到间隙中,减小其大小。如果没有足够的空间来容纳字符,则整个缓冲区将重新分配到一个更大的新大小,并且间隙会在前一个插入点合并。

天真地看着这个并说性能一定很差,因为涉及到所有的复制。错误的。复制操作非常快,可以通过多种方式进行优化。间隙缓冲区还利用了使用模式。在聚焦和插入文本之前,您可能会跳过整个窗口。间隙不会移动以显示 - 仅用于插入(或删除)。

另一方面,在 500MB 文件的开头插入一个字符块,然后在末尾插入另一个字符块是间隙方法的最坏情况,尤其是在超过间隙大小的情况下。这种情况多久发生一次?

连续的内存块在虚拟内存环境中很受重视,因为它涉及的分页更少。此外,读取和写入被简化,因为文件不必被解析和分解成其他数据结构。相反,文件在间隙缓冲区中的内部表示与磁盘相同,可以以最佳方式读取和写入。写入本身可以通过单个系统调用完成(在 *nix 上)。

间隙缓冲区是用于以一般方式编辑文本的最佳算法。它使用最少的内存,并且在各种用例中具有最高的聚合性能。将间隙缓冲区转换为可视窗口有点棘手,因为必须不断维护行上下文。

【讨论】:

  • gap 算法最好的说法完全是垃圾,几十年来一直被 emacs 的粉丝所支持。我是emacs的粉丝,但这种说法仍然是垃圾。 “绳索”方法,平衡包含字符数组而不是叶子中的单个字符的二叉树,从理论的角度来看显然是最佳的,如果你只是增加叶子的大小,任何不愉快的常数因素都可以任意小。
  • @R.. 我不怀疑,但是它是一个相当简单的结构,可以满足大多数人的需求。我建议刚接触文本编辑的人考虑实现一些简单明了的东西,然后测量性能以查看是否需要额外的开发和测试时间。 “过早的优化......”等等。
  • 我也不太喜欢这种方法。它似乎有点过于复杂,并且在某些情况下效率不高。
  • 感谢 Vijay Mathew 的链接。我会以此为参考。
  • @Adam Davis 感谢您的编辑。事实上,您已经展示了如何使外部链接对读者更有用。
【解决方案2】:

如果你想让它扩展,你应该使用平衡二叉树的形式。基本上所有 操作(插入、删除、查找字符、查找行等)都可能是O(log n)。如果您只关心文本的“正常”文件大小(最多几兆),那么您使用什么结构并不重要。

【讨论】:

  • 谢谢 R.. 首先我想从小事做起...用最好的方式让它工作以防万一我以后想扩展它....
【解决方案3】:

您应该将数据“保存”为纯文本。如果您的意思是如何将数据存储在内存中,我推荐一个简单的链表。

如果它只是一个文本编辑器(不是文字处理器),我采取的方法是将每一行存储在它自己的链接节点中。

这是一个很好的简单方法,可以轻松插入和删除行。并且插入或删除文本是高效的,因为在插入或删除文本时只需要移动当前节点内的数据。

你说你不想看源代码,但是,你可以下载我多年前在http://www.softcircuits.com/sw_dos.aspx 写的版本,通过下载pictor.zip 来查看一个简单的文本编辑器。

【讨论】:

  • 感谢来源乔纳森。我不想查看源代码,因为大多数编辑器都太复杂(至少对我来说)无法理解发生了什么。但好的和简单的例子总是救命稻草。我会看看你提供的代码,看起来很小而且很好:)
【解决方案4】:

(非常老的)书Software Tools in Pascal 实现了一个完整的ed-style(想想vim)文本编辑器,包括正则表达式搜索/替换。它使用数组来保存编辑后的文本。

【讨论】:

    【解决方案5】:

    link 提供了很好的信息 - 设计“所见即所得”(或“所见即所得”)文档编辑器的案例研究

    【讨论】:

    • 很遗憾,链接失效了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多