Написание & quot; \ r & quot; с помощью std :: cout в файл сохраняет ранее перезаписанные строки

Я запускаю симуляции с использованием C ++, и для отслеживания прогресса симуляции я пишу результаты как std::cout << "\rSimulation progress: " << progress;согласно этому ответу https://stackoverflow.com/a/3057994/4237753. Так с "\r" Я думал, что переопределяю предыдущую строку, но когда я сохраняю вывод в файлы журнала, ранее переопределенные строки также сохраняются, с ^M перед каждым экземпляром «переопределенных» строк. Теперь у меня есть файлы журналов, которые занимают около 100 МБ, когда они должны быть только несколько КБ.

Пример того, как выглядит файл:

^MSimulation progress: 66.500^MSimulation progress: 66.600^MSimulation
progress: 66.700^MSimulation progress: 66.800^MSimulation progress:
66.900^MSimulation progress: 67.000^MSimulation progress: 67.100^MSimulation
progress: 67.200^MSimulation progress: 67.300

Что я хочу для этой строки, это только последний экземпляр

Simulation progress: 67.300

Есть хороший способ или стандартный способ удалить линии на самом деле?

Спасибо!

0

Решение

Здесь ничего нет. Терминалы никак не стандартизированы. Как файл, они принимают поток байтов, но могут по-разному реагировать на вводимые вами данные.

То есть некоторые могут раскрасить, используя escape-синтаксис. Так получилось, что терминал, который вы используете, лечит \r вернуться к началу строки и начать писать заново. Для вывода файла это просто байт без какого-либо специального значения. Вы даже не гарантированы, что \r сбросит строку на каждом терминале, который вы запускаете. Это зависит от системы.

Мой лучший совет, чтобы отделить ваш пользовательский интерфейс и ваш журнал. Это вообще разные вещи. Вам не нужно помещать одну и ту же информацию в файл и на экран.

Чтобы можно было сделать поведение потока файлов согласованным с терминалом, потребуется написать собственный буфер fstream, который распознает \r и стремиться к прошлому \n, Это не звучит слишком разумно.

2

Другие решения

\r является символом управления выводом. Когда ты пишешь \r подать это только дополнительный символ в нем.

Вы не можете переопределить строку в файле с \r,

2