问题 编写文本编辑器时保存数据的好方法


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

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


11382
2018-01-25 04:04


起源

你似乎意味着一个好方法 商店 数据,因为保存它是指将其写入文件(它不会也不应该涉及程序中的任何数据结构)。 (虽然好问题。) - David X
哇......昨天我只是在想这个问题。 +1读我的想法。 - Tesserex
你可以看看 ed (标准文本编辑器)。 ed 是面向行的,其内部结构应该非常简单。对于那些有幽默感的人: gnu.org/fun/jokes/ed.msg.html - mu is too short


答案:


你会受益匪浅 阅读有关Emacs缓冲区的信息。另见 这个博客,特别是最后的评论,引用这里以便于参考:

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

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

另一方面,在500MB文件的头部插入一个字符块,然后在末尾插入另一个字符块是间隙方法的最坏情况,特别是如果超出间隙的大小。这种情况多久发生一次?

连续内存块在虚拟内存环境中受到重视,因为涉及的寻呼次数较少。此外,读取和写入都是简单的,因为文件不必解析并分解为其他一些数据结构。相反,间隙缓冲区中文件的内部表示与磁盘相同,可以最佳地读写。可以通过单个系统调用(在* nix上)完成写入。

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


8
2018-01-25 04:16



很棒的链接,我希望你不介意编辑。 - Adam Davis
差距算法最好的说法是完全垃圾,几十年来emacs的粉丝一直在延续。我是一个emacs粉丝,但声称仍然是垃圾。从理论的角度来看,“绳索”方法,平衡二元树包含字符数组而不是叶子中的单个字符,显然是最佳的,如果你只是增加叶子大小,任何令人不快的常数因子都可以任意小。 - R..
@R ..我不怀疑,但这是一个相当简单的结构,可以满足大多数人的需求。我建议有新的文本编辑人员考虑实现简单明了的事情,然后测量性能,看看是否需要额外的开发和测试时间。 “过早优化......”等等。 - Adam Davis
我也不是这种方法的忠实粉丝。它似乎有点过于复杂,在某些情况下效率不高。 - Jonathan Wood
感谢您的链接Vijay Mathew。我会用这个作为参考。 - yaami


如果要扩展,可以使用平衡二叉树的形式。基本上可以做到这一点 所有 操作 - 插入,删除,寻找字符,寻找线等 - 是 O(log n)。如果您只关心文本的“理智”文件大小(最多几个megs),那么您使用的结构并不重要。


3
2018-01-25 04:23



谢谢R ..首先,我想从小开始...让它使用最好的方式工作,以防万一我觉得以后缩放.... - yaami


这个 链接 提供了良好的信息 - 设计“你看到了什么 - 你得到什么”(或“所见即所得”)文档编辑器的案例研究


1
2018-01-25 04:27





您应该将数据“保存”为纯文本。如果您的意思是如何将数据存储在内存中,我建议使用简单的链接列表。

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

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

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


1
2018-01-25 04:36



感谢Jonathan的来源。我不想查看源代码,因为大多数编辑器过于复杂(至少对我而言)无法理解正在发生的事情。但好的和简单的例子总是节省生命。我会查看你提供的代码,看起来很小很好:) - yaami


(非常古老的)书 Pascal中的软件工具 实现完整 ed风格 (认为 VIM)文本编辑器,正则表达式搜索/替换包括在内。它使用数组来保存已编辑的文本。


1
2018-01-25 15:09