Ни как не могу додуматся как редактировать большой файл. Если просто вставлять один символ в текст то ясно что все будет тормозить. Значит надо разбивать текст на блоки например по 100 строк и работать с ними. Первой и пока единственное что пришло на ум это двухсвязный список. Каждый элемент списка будет блок текста. при добавлении строки или переполнении блока просто создается новый блок. А при удалении смотрим можно объединить соседние блоки. Мне кажется это плохая идея. Все должно быть проще. Может кто даст какую-нибудь нормальную идею. Зарание благодарю.
Ну думаю хотябы 300 000 строк по 60 символов, т.е. около 17 метров. Хотя реально не найдется текстовый файл больше чем на 20 000 строк, т.е. всего на метр. Но хотелось чтобы можно было быстро работать с файлом на 300 метров.
Проверил на 17 Мег - richedit вставляет и отображает мгновенно, правда потом, при сохранении файла на диск около 3 сек нужно.
Ну так разбей на строки и положи их не в список, а в динамический массив указателей на эти строки. А если строки могут быть длиной больше нескольких килобайт - уже строки начинай бить на блоки, вставка в короткий блок работает быстрее, чем в целую строку. А текщий блок на время редактирования помещай в статический буфер раза в 2 больше размера блока, чтобы избежать слишком частого перевыделения памяти.
Да возможно динамический масив будет лучше. И памяти чуть меньше занимает и доступ быстрей. Вот только стоит ли делать блок меньше 10кб незнаю. Файл маппировать надо точно - это понятно.
FileMapping - фтопку. Там вставка символа столько времени займет, что можно будет за это время файл десять раз вгрузить и выгрузитью. А если файл больше двух гиг... Ну, во общем, ясно.
Можно сделать так: если строки по 60 символов, выдели на каждую вдвое больше, например 128 байт. Зачитай файл в память, побей на строки, чтобы каждая начиналась с адреса кратного 128. Если редактируемая строка после редактирования вместилась в прежние 128 байт, никаких телодвижений. Если нет - выделил кусок под новую строку 128 байт, и дописал в неё, при этом сдвинув адреса в таблице указателей, чтобы вставить указатель на нужную строку. Это всё будет делаться достаточно быстро. Только как ты собрался отображать рваные куски текста в своём едите? Пусть даже двусвязный список, как? Может проще с richedit'ом научиться ))
Вот тема была Пардон, именно "была". Смотрите оффлайн-версию форума, поиск по ключевым словам: редактор текста.
http://catch22.net/tuts/editor01.asp Там же куча полезных ссылок, из которых особенно рекомендую http://catch22.net/tuts/zips/crowley.zip - старое, но все еще актуальное исследование по структурам данных, применяемым в текстовых редакторах. Именно этот документ тебе и нужен, tigsid.