第一步。继承std::streambuf
#include <iostream>
#include <streambuf>
class MyStreamBuf : public std::streambuf
{
enum
{
BUFFER_SIZE = 255,
};
public:
MyStreamBuf()
{
buffer_[BUFFER_SIZE] = '\0';
setp(buffer_, buffer_ + BUFFER_SIZE - 1);
}
~MyStreamBuf()
{
sync();
}
protected:
virtual int_type overflow(int_type c)
{
if (c != EOF)
{
*pptr() = c;
pbump(1);
}
flush_buffer();
return c;
}
virtual int sync()
{
flush_buffer();
return 0;
}
private:
int flush_buffer()
{
int len = int(pptr() - pbase());
if (len <= 0)
return 0;
if (len <= BUFFER_SIZE)
buffer_[len] = '\0';
#ifdef ANDROID
android_LogPriority t = ANDROID_LOG_INFO;
__android_log_write(t, "mylog", buffer_);
#else
printf("%s", buffer_);
#endif
pbump(-len);
return len;
}
private:
char buffer_[BUFFER_SIZE + 1];
};
第二步,创建MyStreamBuf对象。并指定给std::cout
MyStreamBuf g_MyStreamBuf;
std::cout.rdbuf(&g_MyStreamBuf);
//NOTE: std::endl会马上调用sync方法将缓冲区字符写入log,并不仅仅是换行用
std::cout << "hello " << 123 << std::endl;
std::cout << "pi = " << 3.14 << std::endl;
这样,就能够是Eclipse的LogCat查看std::cout输出了。