Вы можете хранить изменения файлов как набор патчей где каждое изменение записывается в виде разницы между состояниями файла. При чтении файла можно применить все патчи к базовому состоянию файла, чтобы получить актуальный контент.
Пример кода для создания базового патча:
struct FilePatch {
int lineNumber;
char* oldLine;
char* newLine;
};
struct FileDiff {
FilePatch* patches;
int patchCount;
};
void applyDiff(char** fileContent, FileDiff* diff) {
for (int i = 0; i < diff->patchCount; ++i) {
int lineNumber = diff->patches[i].lineNumber;
fileContent[lineNumber] = diff->patches[i].newLine;
}
}