Хороший способ сохранить данные при написании текстового редактора

Я планирую сделать текстовый редактор в c. Поэтому просто хотелось узнать, какая структура данных хороша для сохранения текста. Я читал, используя связанный список, был одним из способов сделать это, но не эффективным. Пожалуйста, укажите мне некоторые ссылки, где я могу получить хорошее представление о том, что нужно использовать. Я планирую использовать библиотеку ncurses для ввода пользовательского ввода и захвата ключей и пользовательского интерфейса.

Использование исходного кода существующих редакторов является слишком сложным, все текстовые редакторы огромны, даже консольные редакторы. Какой простой исходный код для консольного редактора для справки?

Ответ 1

Вам будет полезно читать о буферах Emacs. Также см. этот блог, особенно последний комментарий, приведенный здесь для удобства:

Многие версии Emacs, включая GNU, используют единый непрерывный массив символов, фактически разделенный на две секции, разделенные пробелом. Чтобы вставить зазор, сначала перемещается в точку ввода. Вставляемые символы заполняют промежуток, уменьшая его размер. Если у вас недостаточно места для хранения символов, весь буфер перераспределяется на новый больший размер, а пробелы объединяются с предыдущей точкой вставки.

Наивный взгляд на это и сказать, что производительность должна быть плохой из-за всего копирования. Неправильно. Операция копирования невероятно быстра и может быть оптимизирована различными способами. Буферы с зазорами также используют шаблоны использования. Вы можете прыгать по всему окну перед фокусировкой и вставкой текста. Разрыв не перемещается для отображения - только для вставки (или удаления).

С другой стороны, вставка символьного блока в начале 500 МБ файла, а затем вставка другого в конец, является наихудшим случаем для подхода к разрыву, особенно если размер пробелов превышен. Как часто это происходит?

Непрерывные блоки памяти ценятся в средах виртуальной памяти, поскольку задействовано меньшее количество страниц. Более того, чтение и запись упрощаются, потому что файл не нужно разбирать и разбивать на некоторые другие структуры данных. Скорее, внутреннее представление файлов в буфере разрыва идентично диску, и его можно легко считывать и записывать. Пикеты могут выполняться с помощью единого системного вызова (на * nix).

Буфер зазора - лучший алгоритм для редактирования текста в общем виде. Он использует наименьшую память и обладает наивысшей совокупной производительностью во множестве вариантов использования. Перевод буфера пробелов в визуальное окно немного сложнее, поскольку контекст строки должен постоянно поддерживаться.

Ответ 2

Если вы хотите, чтобы он масштабировался, вы должны использовать форму сбалансированного двоичного дерева. Можно сделать так, что в основном все операции - вставка, удаление, поиск символа, поиск линии и т.д. - O(log n). Если вам нужны только размеры файлов "sane" для текста (максимум в несколько мегабайт), не важно, какие структуры вы используете.

Ответ 4

Вы должны "сохранить" данные как обычный текст. Если вы имеете в виду, как хранить данные в памяти, я рекомендую простой связанный список.

Если это просто текстовый редактор (а не текстовый процессор), подход, который я взял, состоял в том, чтобы хранить каждую строку в своей собственной ссылке node.

Это простой простой подход, который упрощает вставку и удаление строк. И вставка или удаление текста эффективна, потому что при вставке или удалении текста необходимо перемещать только данные в текущем node.

Вы сказали, что не хотите смотреть на исходный код, но, тем не менее, вы можете загрузить версию, которую я написал много лет назад в http://www.softcircuits.com/sw_dos.aspx, загрузив pictor.zip, чтобы увидеть простой текстовый редактор.

Ответ 5

(очень старая) книга Программные средства в Pascal реализует полный текстовый редактор ed-style (think vim), регулярный поиск/замещение regexp, Он использует массивы для хранения отредактированного текста.