У меня есть программа на 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.
Возможным обходным путем может быть использование std::cerr
для промежуточного результата (и так для '\b'
),
а также std::cout
для окончательного результата.
Попробуйте каждый раз писать целую строку и писать просто '\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;
}
}
В этом случае у вас будет полный вывод в файле.