gpt4 book ai didi

c++ - 使用 std::cout 添加时间戳

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:36 26 4
gpt4 key购买 nike

我有以下代码将我的 std::cout 输出重定向到日志文件。

std::ofstream out("out.txt");
std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!

现在我想要的是,每当出现换行符时,当前的时间戳就会被写入文件。

我知道我可以通过以下方式实现这一目标:

std::cout << getTime() << "printing data" << std::endl;

但我想要的是 std::cout 以某种方式自动处理它。这可能吗?

最佳答案

我假设,如果下一行的第一个字符出现在输出中,您想要打印时间戳。采用一个新类并从 std::streambuf 继承它并以与处理 filebuf 相同的方式连接它。如果出现换行符,则将此事件存储在对象中。出现另一个字符将时间戳添加到流中。

我写了一个示例,它使用 RAII 习惯用法来连接 streambuf。

class AddTimeStamp : public std::streambuf
{
public:
AddTimeStamp( std::basic_ios< char >& out )
: out_( out )
, sink_()
, newline_( true )
{
sink_ = out_.rdbuf( this );
assert( sink_ );
}
~AddTimeStamp()
{
out_.rdbuf( sink_ );
}
protected:
int_type overflow( int_type m = traits_type::eof() )
{
if( traits_type::eq_int_type( m, traits_type::eof() ) )
return sink_->pubsync() == -1 ? m: traits_type::not_eof(m);
if( newline_ )
{ // -- add timestamp here
std::ostream str( sink_ );
if( !(str << getTime()) ) // add perhaps a seperator " "
return traits_type::eof(); // Error
}
newline_ = traits_type::to_char_type( m ) == '\n';
return sink_->sputc( m );
}
private:
AddTimeStamp( const AddTimeStamp& );
AddTimeStamp& operator=( const AddTimeStamp& ); // not copyable
// -- Members
std::basic_ios< char >& out_;
std::streambuf* sink_;
bool newline_;
};

按以下方式调用此类的对象:

// some initialisation ..
{
AddTimeStamp ats( cout ); // timestamp is active
// every output to 'cout' will start with a 'getTime()' now
// ...
} // restore the old streambuf in the destructor of AddTimeStamp

关于c++ - 使用 std::cout 添加时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22118713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com