Я хочу написать простую программу, которая в зависимости от переданных ей параметров исполняемый файл будет печатать вывод на экран или в файл. Программа проста.
#include<iostream>
int main(int argc, char* argv[]){
... process options...
std::ostream& out = ... // maybe std::cout, maybe a *new* std::ofstream;
out << "content\n";
}
Есть ли подходящая идиома для альтернативы std::cout
или файловому потоку во время выполнения?
Я пробовал с указателями, но это ужасно. Я не мог избежать использования указателей (не говоря уже о том, что для последующего удаления указателя требуется более уродливый код).
#include<iostream>
#include<ofstream>
int main(int argc, char* argv[]){
std::string file = argc>1?argv[1]:"";
std::clog << "file: " << file << '\n';
// if there is no argument it will print to screen
std::ostream* out = (file=="")?&std::cout:(new std::ofstream(file)); // horrible code
*out << "content" << std::endl;
if(out != &std::cout) delete out;
}
Я не знаю, возможно, есть какая-то особенность потоков C++, которая позволяет это делать. Возможно, мне нужно использовать какое-то стирание шрифта. Проблема, я думаю, в том, что std::cout
— это то, что уже существует (является глобальным), а std::ofstream
— это то, что нужно создать.
Мне удалось использовать open
и избежать указателей, но это все еще уродливо:
int main(int argc, char* argv[]){
std::string file = argc>1?argv[1]:"";
std::clog << "file: " << file << '\n';
std::ofstream ofs;
if(file != "") ofs.open(file);
std::ostream& out = (file=="")?std::cout:ofs;
out << "content" << std::endl;
}