ofstream - 我可以将“cout”重定向到文件中吗?

时间:2014-01-11 16:11:19

标签: c++ fstream cout io-redirection ofstream

我只想知道是否有某种方式可以做到这一点:

ofstream exemple (name);
exemple << Display();

Display()是一个void方法,只做类似的事情:

cout << "Something" << endl;

我会这样做,因为我已经为每个类编写了所有方法Display(),我想将它们发送到cout的内容放入我的文件中,或者重新创建一些方法“string Display()”。

有可能吗?

感谢的!马可

3 个答案:

答案 0 :(得分:6)

You can change cout's buffer,但cout是一个全局变量,因此会影响整个程序。

为什么不让Display()接收输出流作为参数?

void Display(std::ostream &cout) {
    cout << "Something" << endl;
}

答案 1 :(得分:4)

不,不是那样。您无法使用void函数的结果,因为它没有。{/ p>

可以使用std::cout的底层缓冲区进行攻击,将其交换为example,但是我不会推荐这个 ...并且您问题中的代码仍然无效。

你可以这样做:

#include <ostream>
#include <fstream>

void Display(std::ostream& os)
{
    os << "Something" << std::endl;
}

int main()
{
   const std::string name = "someFile.txt";
   std::ofstream example(name);
   Display(example);
}

答案 2 :(得分:1)

您可以使Display成为操纵器display_msg的辅助函数,这是一个封装输出的类。 Display无法返回void,因为如果您要查找os << Display()语法,Display必须返回void以外的其他内容。

以下是display_msg的定义:

class display_msg { };

这个课程是空的,因为它没有任何重要性。我们将重载此类的插入运算符,以便我们可以访问输出流并将我们的自定义数据插入到:

std::ostream& operator<<(std::ostream& os, const display_msg&)
{
    return os << "My message";
}

这是一个非常简单的设置。但正如您所说,您希望将输出重定向到标准输出(std::cout)。为此,您必须将std::cout的缓冲区复制到文件流中。您可以使用RAII(为了管理对象之间的生命周期依赖关系)来实现这一点:

struct copy_buf
{
public:
    copy_buf(std::ios& lhs, std::ios& rhs)
        : str(lhs), buf(lhs.rdbuf())
    {
        lhs.rdbuf(rhs.rdbuf());
    }

    ~copy_buf() { str.rdbuf(buf); }
private:
    std::ios& str;
    std::streambuf* buf;
};

插入器可以这样使用:

std::ostream& operator<<(std::ostream& os, const display_msg&)
{
    copy_buf copy(os, std::cout);
    return os << "My message";
}

Display是一个简单的辅助函数,它返回类:

display_msg Display()
{
     return display_msg();
}

std::ifstream f("in.txt");
f << Display(); // redirects to standard output