使用命令行参数控制程序中的打印输出
Controlling print outs in a program with command line argument
我试图在我的程序中控制打印输出。我为此编写了一个小脚本,它接受一个命令行参数并根据传递给它的标志 -v
决定打印或不打印。现在我必须在我的实际程序中到处写 out(bool)
。是否可以在程序开始时做出决定,只使用 out
而不是 out(bool)
.
class mystreambuf : public std::streambuf
{
};
mystreambuf nostreambuf;
std::ostream nocout(&nostreambuf);
#define out(b) ((b==true)?std::cout : nocout )
int main(int argc, char* argv[])
{
std::cout << "Program name is: " << argv[0] << "\n";
int counter;
bool verbose;
if (argc == 1)
{
std::cout << "No command line argument passed" << argv[0] << "\n";
}
if (argc >= 2)
{
for (counter = 0; counter < argc; counter++)
{
std::cout << "Argument passed are: " << argv[counter] << "\n";
if (strcmp(argv[counter], "-v") == 0)
{
verbose = true;
}
else
{
verbose = false;
}
}
}
out(verbose) << "\n hello world \n";
system("pause");
}
您可以创建一个您在开始时设置的单例实例并登录。类似于:
class Printer {
public: static std::streambuf getInstance() {
if (_instance._printing) {
return std::cout;
}
return _instance._nostreambuf;
}
static void setPrinting(bool set) {
_instance._printing = set;
}
private:
static Printer _instance;
mystreambuf _nostreambuf;
bool _printing;
// delete constructors and assignment operators.
}
注:快速伪代码,未测试。
你会使用哪个:
Printer::setPrinting(verboseBool);
Printer::getInstance() << "Print text";
但是你要做的是一个记录器。其中有很多。 Here is a nice list.
只需将 out
作为以下两个选项之一的变量:
std::ostream &out = verbose ? std::cout : nocout;
并使用 out <<
继续打印
一个简单的方法是构建一个包含布尔标志和对实际流的引用的最小 class。那么 <<
运算符要么是空操作,要么是对实际流的委托。可能是:
class LogStream {
std::ostream& out;
bool verbose;
public:
LogStream(std::ostream& out = std::cout): out(out) {}
void set_verbose(bool verbose) {
this->verbose = verbose;
}
template <class T>
LogStream& operator << (const T& val) {
if (verbose) {
out << val;
}
return *this;
}
};
然后可以这样使用:
int main(int argc, char* argv[])
{
LogStream out;
...
out.set_verbose(verbose);
out << "\n hello world \n";
...
}
我试图在我的程序中控制打印输出。我为此编写了一个小脚本,它接受一个命令行参数并根据传递给它的标志 -v
决定打印或不打印。现在我必须在我的实际程序中到处写 out(bool)
。是否可以在程序开始时做出决定,只使用 out
而不是 out(bool)
.
class mystreambuf : public std::streambuf
{
};
mystreambuf nostreambuf;
std::ostream nocout(&nostreambuf);
#define out(b) ((b==true)?std::cout : nocout )
int main(int argc, char* argv[])
{
std::cout << "Program name is: " << argv[0] << "\n";
int counter;
bool verbose;
if (argc == 1)
{
std::cout << "No command line argument passed" << argv[0] << "\n";
}
if (argc >= 2)
{
for (counter = 0; counter < argc; counter++)
{
std::cout << "Argument passed are: " << argv[counter] << "\n";
if (strcmp(argv[counter], "-v") == 0)
{
verbose = true;
}
else
{
verbose = false;
}
}
}
out(verbose) << "\n hello world \n";
system("pause");
}
您可以创建一个您在开始时设置的单例实例并登录。类似于:
class Printer {
public: static std::streambuf getInstance() {
if (_instance._printing) {
return std::cout;
}
return _instance._nostreambuf;
}
static void setPrinting(bool set) {
_instance._printing = set;
}
private:
static Printer _instance;
mystreambuf _nostreambuf;
bool _printing;
// delete constructors and assignment operators.
}
注:快速伪代码,未测试。
你会使用哪个:
Printer::setPrinting(verboseBool);
Printer::getInstance() << "Print text";
但是你要做的是一个记录器。其中有很多。 Here is a nice list.
只需将 out
作为以下两个选项之一的变量:
std::ostream &out = verbose ? std::cout : nocout;
并使用 out <<
一个简单的方法是构建一个包含布尔标志和对实际流的引用的最小 class。那么 <<
运算符要么是空操作,要么是对实际流的委托。可能是:
class LogStream {
std::ostream& out;
bool verbose;
public:
LogStream(std::ostream& out = std::cout): out(out) {}
void set_verbose(bool verbose) {
this->verbose = verbose;
}
template <class T>
LogStream& operator << (const T& val) {
if (verbose) {
out << val;
}
return *this;
}
};
然后可以这样使用:
int main(int argc, char* argv[])
{
LogStream out;
...
out.set_verbose(verbose);
out << "\n hello world \n";
...
}