好的,这是一个有点厚颜无耻的问题.我想构建一个简单的文本编辑器(使用我自己的文本模式屏幕处理).我只想要一个可用于表示文本缓冲区的数据结构的好例子,以及一些简单的char/text插入/删除示例.我自己可以处理所有其余代码(文件i/o,控制台i/o等).一个很好的简单编辑器源的链接将很棒(C或C++).
我曾经为一家主要产品是文本编辑器的公司工作.虽然我主要使用脚本语言,但编辑器本身的内部设计自然是讨论的主要话题.
它似乎分解为两个普遍的思路.一个是您自己存储每一行,然后将它们链接在链接列表或您满意的其他整体数据结构中.优点是任何面向行的编辑操作(例如删除整行,或移动文件中的行块)实现起来都是微不足道的,因此快速闪电.缺点是加载和保存文件需要更多的工作,因为你必须遍历整个文件并构建这些数据结构.
当时的另一个思路是尝试将文字保持在一起而不管换行时的断线,只有在编辑时才需要将它们分开.优点是文件的未编辑大块可以很容易地被发送到文件.如此简单的编辑加载文件,更改一行并保存文件,速度非常快.缺点是面向行或列块操作的执行非常耗时,因为您必须解析这些文本并移动大量数据.
我们始终坚持以线路为导向的设计,无论价值多少,我们的产品被认为是当时最快的编辑之一.
"四人帮"一书(设计模式)有一个基于GUI的文本编辑器,因为它是示例的主要来源,是一本值得拥有的书.
一般的"纯文本"编辑器可能使用绳索,这是SGI的STL 实现的.基本上,它们是字符缓冲区的链接列表.这样,插入/删除字符涉及更改较小的缓冲区和一些指针,而不是将整个文档存储在单个缓冲区中并且必须移动所有内容.
这是2008年.不要写文本编辑器; 你正在重新开火.
还在?我不确定这是否适用或您计划支持哪些平台,但Neatpad系列教程是开始考虑编写文本编辑器的好地方.他们专注于Win32作为基础平台,但许多经验教训将适用于任何地方.
我最喜欢的解决方案是间隙缓冲区,因为它非常容易实现并具有良好的摊销效率.只需使用单个字符数组,将区域指定为间隙.一旦理解了这个概念,代码就会自然地遵循.
您还需要辅助数组[vector
这两个在线文档为文本编辑器提供了一个小的,但有用的"知名"数据结构/技术的聚宝盆.
文本序列的数据结构描述并实验分析了一些数据结构,倾向于将片表作为所选择的数据结构.然而,Net.wisdom似乎倾向于差距缓冲区,因为它足以进行文本编辑,并且更容易实现/调试.
"文本编辑工艺"(www.finseth.com/craft/)是一项较旧的工作,不仅仅涉及数据结构,还面向Emacs风格的编辑器; 但这些概念通常很有用.