如何将 std::ofstream 重定向到 std::cout?

6
我正在处理一些使用类型为std::ofstream*的全局调试记录器的代码。由于我正在实时使用代码,而不是设计用于批处理方法,因此我希望将其重定向到std::cout
请问是否可以将它使用的全局std::ofstream*指针重定向到std::cout?我知道std::ofstream继承自std::ios,允许使用rdbuf()方法更改流缓冲区,但不幸的是,它似乎重新定义了rdbuf()方法,这使得以下代码无法编译:
gOsTrace = new std::ofstream();
gOsTrace->rdbuf(std::cout.rdbuf());

有没有其他方法可以将对象重定向指向?


9
记录器必须使用std::ofstream*吗?它不能使用更通用的std::ostream*吗?然后,您只需要将此指针分配为新流即可。 - Martin York
std::ios::tie是什么?http://www.cplusplus.com/reference/ios/ios/tie/ - Severin Pappadeux
2
@SeverinPappadeux,这只是偶尔刷新它。例如,当有输入操作时,std::cin 会刷新 std::cout - chris
不幸的是,因为这不是我的代码(我只是链接它,并且有限的能力进行更改),所以我不愿意改变记录器类型,特别是考虑到它是一个全局变量,在许多地方都被使用,所以简短的答案是否定的,记录器不能是更通用的std::ostream... - stix
你的示例代码是非法的,“new”会给出一个指针,但你随后却在它上面使用了“.”。 - M.M
1个回答

11

rdbuf() 方法是具体的 IOStream 流类中隐藏在 std::ios 中声明方法的一个方法。为了找到基类重载,您需要进行明确的限定:

rdbuf() 方法是具体的 IOStream 流类中隐藏在 std::ios 中声明方法的方法。为了找到基类的重载版本,您需要使用显式的限定符:

gOsTrace->basic_ios<char>::rdbuf(std::cout.rdbuf());

谢谢!这个有效。但需要注意的是,除非ofstream成功打开一个写文件,否则它实际上不会重定向到std::cout。也就是说,像我的代码中的默认构造函数不会重定向。 - stix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接