[英]How to limit the number of char printed on an output stream?
為了調試,我想將 std::cerr 上打印的字符數限制為某個值。
為了尊重原始代碼,我不想簡單地刪除使用 std::cerr 的代碼行,而是讓它們無效。
有什么辦法可以在 C++ 中實現這一點嗎?
我想像這樣使用它:
{
int max_char = 30;
LimitChars c(cerr, max_char);
// my code containing a lot of write on cerr
}
是的,要限制打印在std:cerr上的字符數,您可以使用這些行:
{
int max_char = 30;
LimitChars c(cerr, max_char);
// my code containing a lot of write on cerr
}
只需添加類 LimitChars 的以下定義:
#include <iostream>
#include <sstream>
using namespace std;
class LimitChars {
public:
LimitChars(ostream &s1, int max_val) : m_s1(s1), m_buf(s1.rdbuf(), max_val), m_s1OrigBuf(s1.rdbuf(&m_buf) ) {}
~LimitChars() {
m_s1.rdbuf(m_s1OrigBuf);
//m_s1 << endl << "output " << m_buf.GetCount() << " chars" << endl;
}
int GetCount(){
return m_buf.GetCount();
}
private:
LimitChars &operator =(LimitChars &rhs) = delete;
class LimitCharsBuf : public streambuf {
public:
LimitCharsBuf(streambuf* sb1, int max_val) : m_sb1(sb1), m_max_val(max_val) {}
size_t GetCount() const {
return m_count;
}
protected:
virtual int_type overflow(int_type c) {
if( streambuf::traits_type::eq_int_type(c, streambuf::traits_type::eof()) )
return c;
else {
if( m_count >= (size_t) m_max_val ){
// return eof when the limit is reached (see std::streambuf::overflow for more info)
return streambuf::traits_type::eof();
}else{
m_count++;
return m_sb1->sputc((streambuf::char_type)c);
}
}
}
virtual int sync() {
return m_sb1->pubsync();
}
streambuf *m_sb1;
int m_max_val;
size_t m_count = 0;
};
std::ostream &m_s1;
LimitCharsBuf m_buf;
streambuf * const m_s1OrigBuf;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.