Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将std::of流重定向到std::cout?_C++_C++11_Stl_Cout_Ofstream - Fatal编程技术网

C++ 如何将std::of流重定向到std::cout?

C++ 如何将std::of流重定向到std::cout?,c++,c++11,stl,cout,ofstream,C++,C++11,Stl,Cout,Ofstream,我正在处理一些使用全局调试记录器的代码,该记录器的类型为std::ofstream*。我想把它重定向到std::cout,因为我在实时使用代码,而不是为其设计的批处理方法 是否可以将它使用的全局std::ofstream*指针重定向到std::cout?我知道std::ofstream继承自std::ios,它允许使用rdbuf()方法更改流缓冲区,但不幸的是,std::ofstream重新定义了rdbuf()方法,这使得以下代码无法编译: gOsTrace = new std::ofstrea

我正在处理一些使用全局调试记录器的代码,该记录器的类型为
std::ofstream*
。我想把它重定向到std::cout,因为我在实时使用代码,而不是为其设计的批处理方法

是否可以将它使用的全局
std::ofstream*
指针重定向到
std::cout
?我知道
std::ofstream
继承自
std::ios
,它允许使用
rdbuf()
方法更改流缓冲区,但不幸的是,
std::ofstream
重新定义了
rdbuf()
方法,这使得以下代码无法编译:

gOsTrace = new std::ofstream();
gOsTrace->rdbuf(std::cout.rdbuf());
是否有其他方法将
gOsTrace
对象重定向到
cout

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

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

记录器是否必须使用
std::ofstream*
它不能是更通用的
std::ostream*
。然后,您所要做的就是用新的stream.std::ios::tie为这个指针赋值@SeverinPapadeux所做的只是偶尔冲洗一下。例如,当有输入操作时,
std::cin
会刷新
std::cout
。不幸的是,因为它不是我的代码(我只是链接到它,修改的能力有限),我不愿意更改记录器类型,特别是考虑到它是在许多地方使用的全局类型,所以简短的答案是否定的,记录器不能是更通用的std::ostream…您的示例代码是非法的,
new
给出了一个指针,但是您在itThanks上使用了
!这很有效。但是应该注意的是,除非ofstream成功地打开一个文件进行写入,否则它实际上不会重定向到std::cout。也就是说,我的代码中的默认构造函数不会重定向。