Ежели маркеры всегда в пределах одной строки, то алгоритм такой:
Python
def create_mark_index(data_name, find_mark, save_mark):
QTextStream stream(data_name);
while not stream.atEnd():
pos = stream.pos()
line = stream.readLine()
mark = find_mark(line)
if mark:
save_mark(pos, line, mark)
Здесь find_mark принимает очередную строку и возвращает нужные данные о маркере или False если ничего не нашла.
save_mark - принимает позицию старта строки, саму строку и данные о маркере, которые вернула find_mark.
Скорость будет весьма неплохой. Памяти потребуется немного.
Пример ишет первое вхождение любой подстроки из
eni, beni, riki, taki в строке файла данных и выводит на стандартный вывод позицию строки, позицию найденной подстроки и её саму:
Python
def find_mark(line):
return re.search('eni|beni|riki|taki', line, re.I)
def save_mark(pos, line, mark):
print pos, mark.start(), mark.group()
create_mark_index(data_name, find_mark, save_mark)
Переложить на С++ труда не составляет.
Если маркеры могут захватывать несколько строк - придётся несколько усложнить create_mark_index организуя окно. Если реализовать нормально (кольцевой буфер, например), на скорость это мало повлияет.