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