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

yaa*_*ami 11 c programming-languages data-structures

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

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

Vij*_*hew 8

阅读有关Emacs缓冲区的信息,您将受益匪浅.另请参阅此博客,特别是最后评论,引用此处以便于参考:

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

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

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

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

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

  • 差距算法最好的说法是完全垃圾,几十年来被emacs的粉丝所延续.我是一个电子邮件粉丝,但声称仍然是垃圾.从理论的角度来看,"绳索"方法,平衡二元树包含字符数组而不是叶子中的单个字符,显然是最佳的,如果你只是增加叶子大小,任何令人不快的常数因子都可以任意小. (2认同)
  • @R..我对此并不怀疑,但它是一个相当简单的结构,可以满足大多数人的需求。我建议刚接触文本编辑的人考虑实现一些简单明了的东西,然后测量性能以查看是否需要额外的开发和测试时间。“过早的优化......”等等。 (2认同)