我只想知道是否有某种方式可以做到这一点:
ofstream exemple (name);
exemple << Display();
Display()是一个void方法,只做类似的事情:
cout << "Something" << endl;
我会这样做,因为我已经为每个类编写了所有方法Display(),我想将它们发送到cout的内容放入我的文件中,或者重新创建一些方法“string Display()”。
有可能吗?
感谢的!马可
答案 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