Mój pierwszy pomysł był dość prosty,
zarejestrować 1024 sloty pamięci typu Char i w każdym trzymać znak -> Text = new char[1024];
W chwili gdybym potrzebował więcej przestrzeni mógłbym po prostu powiększyć tablicę.
Ale tu pojawia się problem, gdybym miał tekst:
"To jest mój program do edycji tekstu"
A chciałbym zamienić tekst do:
"To jest mój <super> program do edycji tekstu"
W tym przypadku musiałbym przesunąć sporo literek w prawo, oczywiście dla krótkiego tekstu nie jest to problemem,
Ale chciałbym aby program z perspektywy logicznej działał dla dużych i małych tekstów.
To nie zakładaj że fragmenty są stałej długości. Logika się skomplikuje, ale wstawianie czy usuwanie będzie przesuwać w najgorszym razie rozmiar fragmentu, a nie całego pliku.
ale w tym przypadku użyłem czegoś na wzór LinkedList, podzieliłem tekst na klastry o wielkości 256 znaków
I każdy klaster posiadał wskaźnik do następnego i poprzedniego klastra.
Co masz z takimi małymi porcjami danych? 2 wskaźniki 64bit to już narzut 5%. Nie ma sensu robić fragmentów mniejszych niż kilkadziesiąt kilobajtów.
- trzymałby w RAM te linijki, które uległy zmianie (std::map<size_t, std::wstring> zmienioneLinijki;, gdzie klucz to numer wiersza, a wartość to zmieniony tekst)
- po kliknięciu 'zapisz' tworzyłby plik tymczasowy przepisując zawartość oryginalnego pliku dla linijek niezmienionych + zapisywał zawartość linijek zmienionych z RAM
Brakuje mi tu opisu jak obsługiwać wstawianie i usuwanie linii, ale jest większy problem: find & replace potencjalnie zmieni wszystkie linie w pliku, więc wyskoczysz z RAMu. Gdy dane nie mieszczą się w RAMie, to patrzymy na algorytmy na taśmach. Ten rejestr zmian powinien być przede wszystkim trzymany w pliku, a struktury w RAMie można dodać później w roli optymalizacji.
Jeśli np zmieni się wszystko, rejestr będzie wielokrotnie większy niż sama treść pliku, więc pewnie trzeba by wykrywać taką sytuację i zapisywać do tempa cały wynikowy plik i liczyć zmiany od niego. No i jeszcze użytkownicy lubią mieć undo/redo na kilka kroków..
Pomijając techniczną możliwość/niemożliwość, jeśli chcesz edytować plik tekstowy 100GB "notatnikiem", to coś poszło mocno w krzaki już na etapie planowania.
Jak działają od zaplecza wszystkie edytory tekstowe.
W większości trzymają dane w RAMie, bo to daje responsywność której oczekuje się od aplikacji GUI. Wielkie dane przetwarza się strumieniowo w terminalu, albo edytorami nieformatowanymi (hex edytorami typowo).
kilka GB duży, mój RAM pozwalał na uruchomienie takiego pliku ale N++ wyświetlił komunikat że za duży.
Z mojego szybkiego eksperymentu wychodzi że użycie RAMu przez N++ to coś między 6x a 8x rozmiar pliku. 6x dla pliku złożonego z samych \n, 8x dla pliku z jedną linią.