[英]Redirect std:cout to std::ofstream , getting an error
我将标准输出数据重定向到std :: ofstream缓冲区,以将数据写入文件中。 以下代码实现了这一点,
if ( isActive ){
try{
std::string traceFileName = "traceLog"+getTime()+".log";
std::ofstream out(traceFileName.c_str());
std::streambuf *countbuf = std::cout.rdbuf();
std::cout.rdbuf ( out.rdbuf() ) ;
std::cout<<"buffer pointed\n"<<std::endl;
}
当我在单个.cpp中实现上述代码时,它会执行并dada正在文件中写入。但是对于以下情况,
A( bool isActive){
if ( isActive ){
try{
std::string traceFileName = "traceLog"+getTime()+".log";
std::ofstream out(traceFileName.c_str());
std::streambuf *countbuf = std::cout.rdbuf();
std::cout.rdbuf ( out.rdbuf() ) ;
std::cout<<"buffer pointed\n"<<std::endl;
}
然后从另一个.cpp函数调用A(true),我希望在整个c ++项目中调用A()之后再执行std :: cout <“ printing data \\ n”; 那里的数据将被打印到文件中。 但是我的代码编译良好,在运行时抛出以下错误,
(process:10365): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
没有收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。
(进程:10365):GConf-WARNING **:客户端无法连接到D-BUS守护程序:未收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。
(进程:10365):GConf-WARNING **:客户端无法连接到D-BUS守护程序:未收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。 QGtkStyle无法检测到当前的GTK +主题。 Qt:会话管理错误:不支持指定的任何身份验证协议
但是如果我将以下代码放在main位置,
std::string traceFileName = "traceLog"+getTime()+".log";
std::ofstream out(traceFileName.c_str());
std::streambuf *countbuf = std::cout.rdbuf();
std::cout.rdbuf ( out.rdbuf() ) ;
运行时,所有std :: cout数据都已写入文件中。 ut抛出以下错误。 我该如何解决这个错误。
enter code here(process:10777): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
没有收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。
(进程:10777):GConf-WARNING **:客户端无法连接到D-BUS守护程序:未收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。
(进程:10777):GConf-WARNING **:客户端无法连接到D-BUS守护程序:未收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。 QGtkStyle无法检测到当前的GTK +主题。 Qt:会话管理错误:不支持指定的任何身份验证协议
问题在于,在离开创建文件流的作用域之前,不会还原您的缓冲区。 std::cout
仍将保留指向最终尝试写入的缓冲区的指针。
我相信,一个选择是让out
static
,另一个是创建重新分配原来的缓冲区一类std::cout
被遗忘的范围时:
class buffer_restore
{
public:
buffer_restore(std::ios& _ios)
: ios(_ios)
, sbuf(_ios.rdbuf())
{ }
~buffer_restore()
{
ios.rdbuf(sbuf);
}
private:
std::ios& ios;
std::streambuf* sbuf;
};
这是一个如何使用它的示例:
{
buffer_restore br(std::cout);
std::ofstream out(traceFileName.c_str());
std::streambuf* countbuf = std::cout.rdbuf(out.rdbuf());
} // std::cout's buffer is restored to the original when br was constructed
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.