Как изменить только временные коды, но не другие числа или буквы в текстовом файле?

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

Это для файлов субтитров srt. Тайм-коды имеют формат HH.MM.SS,mmm. Файлы содержат другие числа (например, в шестнадцатеричных цветах), поэтому я хочу искать числа только в определенном формате временного кода.

У меня уже есть функция, которая принимает время ввода в секундах и возвращает время вывода в секундах. Также должно быть довольно легко преобразовать формат «тайм-код» во время в секундах.

Это пример текстового файла:

1
00:00:00,000 --> 00:00:09,138
<font color="#CCCCCC">alexxa</font><font color="#E5E5E5"> who's your favorite president</font>

2
00:00:04,759 --> 00:00:12,889
<font color="#E5E5E5">George Washington</font><font color="#CCCCCC"> has my vote Alexa</font>

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


person evn    schedule 25.04.2019    source источник
comment
Хотя вы можете изменить файл на месте, если заменяемые символы ТОЧНО совпадают с исходным номером, но лучше избегать этого сценария, поскольку он ненадежен. Лучше прочитать файл в память, внести изменения и записать новый файл.   -  person David C. Rankin    schedule 26.04.2019


Ответы (1)


Учитывая, что это текстовый формат, наиболее эффективным способом сопоставления (и замены) формата меток времени в вашем файле будет использование регулярных выражений: https://en.cppreference.com/w/cpp/regex

алгоритм, который вам нравится: вы читаете строку за строкой из исходного файла, для каждой прочитанной строки, где соответствует RE, вы заменяете ее новыми временными метками (т.е. создаете новую строку) и выводите в новый файл (или в буфер, который позже может быть зафиксирован в исходном файле - после завершения обработки). Остальные строки (где RE не совпадает) вы выводите без изменений, как они были прочитаны.

person Dmitry    schedule 26.04.2019