Код, который может выводить изменяемый номер как в терминал, так и в файл

У меня есть программа на C ++, которая записывает меняющиеся числа на экран, что-то вроде следующего фрагмента:

    stringstream ss, ssd; ss << 0; int decs=0; ssd << decs;

cout << "Number ";

for(int i=1;i<=1000;i++) {

cout << ss.str() << "   Decades: " << decs; cout.flush();

int l=ss.str().length()+12+ssd.str().length();
for(int j=0;j<l;j++) cout << "\b";

this_thread::sleep_for (chrono::milliseconds(100));

ss.str(""); ss << i;

if(i%10==0) {
decs++; ssd.str(""); ssd << decs;
}

}

Это работает нормально, но иногда (не всегда) я хотел бы отправить вывод в файл вместо терминала, используя, например, ./prog > out.txt, Здесь символ возврата \b не удаляет символ, но выводит некоторый символ (поиск в Google говорит, что это не удивительно).

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

Я использую Cygwin на Windows 7.

1

Решение

Возможным обходным путем может быть использование std::cerr для промежуточного результата (и так для '\b'),

а также std::cout для окончательного результата.

1

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

Попробуйте каждый раз писать целую строку и писать просто '\r' без '\n'

stringstream ss, ssd; ss << 0; int decs=0; ssd << decs;

for(int i=1;i<=1000;i++) {

cout << "Number " << ss.str() << "   Decades: " << decs; cout.flush();

//int l=ss.str().length()+12+ssd.str().length();
//for(int j=0;j<l;j++) cout << "\b";
cout << '\r';

this_thread::sleep_for (chrono::milliseconds(100));

ss.str(""); ss << i;

if(i%10==0) {
decs++; ssd.str(""); ssd << decs;
}

}

В этом случае у вас будет полный вывод в файле.

2