Я предполагаю, что ваша программа ведет себя подобно стандартным инструментам Unix, что, если не дано, файл будет записывать в стандартный вывод, а когда ему дают файл, будет записывать в этот файл. Вы можете перенаправить cout
для записи в другой потоковый буфер. Пока ваше перенаправление живо, все, что записано в cout, прозрачно записывается в указанное вами место назначения. Как только объект перенаправления выходит из области видимости, исходный поток помещается, и вывод снова выводит на экран:
struct CoutRedirect {
std::streambuf * old;
CoutRedirect():old(0) {
// empty
}
~CoutRedirect() {
if(old != 0) {
std::cout.rdbuf(old);
}
}
void redirect(std::streambuf * to) {
old = std::cout.rdbuf(to);
}
}
int main() {
std::filebuf file;
CoutRedirect pipe;
if(outFileRequested) {
file.open("foo.txt", std::ios_base::out);
pipe.redirect(&file);
}
}
Теперь cout перенаправляется в файл, пока канал работает в main. Вы можете сделать его более «готовым к производству», сделав его не подлежащим копированию, поскольку он не готов к копированию: если копия выходит за пределы области, она уже восстановит исходный поток.