Meh*_*dad 5 algorithm text text-editor
我一直在考虑编写一个文本编辑器控件,它可以编辑任意长度(比如数百兆字节)的文本,在某些方面类似于Scintilla编辑器.目标是延迟读取文件,因此用户不必阅读500兆字节的数据,只是为了查看它的一小部分.我遇到两个问题:
在我看来,不可能为这样的编辑器实现任何合理的滚动功能,除非我预先读取整个文件一次,以便找出换行符.这是真的吗?或者有没有办法近似事物,我没想到?
由于Unicode的各种问题(例如,它允许许多字节只表示一个字符,不仅仅是因为可变长度编码而且还因为重音等),似乎几乎不可能准确确定屏幕上可以容纳多少文本 - 我必须使用TextOut()或其他东西来绘制一个角色,测量它有多大,然后绘制下一个角色.即便如此,仍然没有说明我如何将用户的点击映射回正确的文本位置.
有什么我可以在网上阅读有关处理这些问题的算法?我搜索过,但我没有找到任何东西.
谢谢!
您可以根据数据大小而不是行来设置"粗略"位置.文本窗口的"精细"位置可以基于任意入口点周围的本地扫描.
这意味着您需要编写可以在本地扫描(向后和向前)以查找行开始,计算Unicode字符等的函数.这不应该太难; UTF8旨在以这种方式轻松解析.
您可能需要特别考虑如何处理极长线.由于线路的长度没有上限,这使得查找线路的开始(或结束)成为无限制的任务; 我相信屏幕编辑器显示所需的一切都应该是本地的.
最后,如果你想要一个通用的文本编辑器,你需要弄清楚当你想要保存一个插入/删除了东西的文件时你要做什么.直截了当的是重写文件; 然而,对于一个巨大的文件来说,这显然需要更长的时间.如果没有足够的空间容纳修改过的副本,您可能会遇到用户遇到的问题,所以至少,您需要检查以确保文件系统上有足够的空间.