我打算在c中做一个文本编辑器。所以只想知道保存文本的数据结构是什么。我阅读使用链表是一种方法,但效率不高。请指出一些参考资料,我可以很好地了解需要使用的内容。我打算使用ncurses库来获取用户输入和捕获密钥和UI。
使用现有编辑器的源代码有点过于复杂,所有文本编辑器都很庞大,甚至只有控制台编辑器。任何简单的控制台编辑器源代码供参考?
答案 0 :(得分:8)
您将受益reading about Emacs buffers。另请参阅this blog,尤其是最后的评论,引用此处以便于参考:
许多版本的Emacs,包括GNU,使用一个连续的字符数组,实际上分为两个部分,由间隙分隔。插入间隙首先移动到插入点。插入的字符填入间隙,减小其大小。如果没有足够的空间来容纳字符,则整个缓冲区将重新分配到更大的新大小,并且间隙在前一个插入点处合并。
天真地看待这一点,并说由于所涉及的所有复制,性能必须很差。错误。复制操作非常快,可以通过多种方式进行优化。间隙缓冲区还利用了使用模式。在聚焦和插入文本之前,您可能会跳过窗口。间隙不会移动显示 - 仅用于插入(或删除)。
另一方面,在500MB文件的头部插入一个字符块,然后在末尾插入另一个字符块是间隙方法的最坏情况,特别是如果超出间隙的大小。这种情况多久发生一次?
连续内存块在虚拟内存环境中受到重视,因为涉及的分页较少。此外,读取和写入都是简单的,因为文件不必解析并分解为其他一些数据结构。相反,间隙缓冲区中文件的内部表示与磁盘相同,可以最佳地读写。写入本身可以通过单个系统调用完成(在* nix上)。
间隙缓冲区是以一般方式编辑文本的最佳算法。它使用最少的内存,并且在各种用例中具有最高的聚合性能。将间隙缓冲区转换为可视窗口有点棘手,因为必须不断维护行上下文。
答案 1 :(得分:3)
如果要扩展,可以使用平衡二叉树的形式。有可能使它基本上所有操作 - 插入,删除,寻找字符,寻找线等等 - 是O(log n)
。如果您只关心文本的“理智”文件大小(最多几个megs),那么您使用的结构并不重要。
答案 2 :(得分:1)
这个link提供了很好的信息 - 设计一个“你看得出什么 - 你得到什么”(或“所见即所得”)文档编辑器的案例研究
答案 3 :(得分:1)
您应该将数据“保存”为纯文本。如果您的意思是如何将数据存储在内存中,我建议使用简单的链接列表。
如果它只是一个文本编辑器(不是文字处理器),我采用的方法是将每一行存储在它自己的链接节点中。
这是一个很简单的方法,可以轻松插入和删除行。插入或删除文本是有效的,因为在插入或删除文本时,只需要移动当前节点内的数据。
你说你不想看源代码,但是,你可以下载很多年前我在http://www.softcircuits.com/sw_dos.aspx写的版本,下载pictor.zip看一个简单的文本编辑器。< / p>
答案 4 :(得分:1)
(非常古老的)本书Software Tools in Pascal实现了一个完整的 ed-style (想想 vim )文本编辑器,包括regexp search / replace。它使用数组来保存已编辑的文本。