【问题标题】:ofstream - Can I redirect a "cout" into file?ofstream - 我可以将“cout”重定向到文件中吗?
【发布时间】:2014-01-11 16:11:18
【问题描述】:

我只是想知道你是否有办法做到这一点:

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

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

cout << "Something" << endl;

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

有可能吗?

谢谢!马可

【问题讨论】:

  • 你可以返回ostream。或者做流操作符重载(tutorialspoint.com/cplusplus/…),因为你说你正在使用类。
  • 我试过了,但是得到一个错误,我不能返回一个私人成员(cout)。

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


【解决方案1】:

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

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

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

【讨论】:

  • 非常简单实用!谢谢!:D
【解决方案2】:

不,不是那样。你永远不能使用void函数的结果,因为它没有。

可以破解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);
}

【讨论】:

    【解决方案3】:

    您可以使Display 成为操纵器display_msg 的辅助函数,该类封装了输出。 Display 不能返回 void,因为如果你正在寻找 os &lt;&lt; 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多