使用命令行参数控制程序中的打印输出

时间:2018-07-10 08:34:35

标签: c++ ostream

我正在尝试控制程序中的打印输出。我为此编写了一个小脚本,该脚本带有命令行参数,并根据传递给它的标志-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");
}

3 个答案:

答案 0 :(得分:1)

您可以创建在开始时设置的单例实例并登录。像这样:

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.

答案 1 :(得分:1)

一种简单的方法是构建一个包含布尔标志和对实际流的引用的最小类。这样<<运算符将成为无操作者或对实际流的委派。可能是:

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";
    ...
}

答案 2 :(得分:0)

只需将out设为两个选项之一的变量即可:

std::ostream &out = verbose ? std::cout : nocout;

并继续使用out <<

打印