printf(...)
返回输出到控制台的字符数,我发现这对设计某些程序非常有帮助。所以,我想知道在C++中是否有类似的功能,因为cout <是一个没有返回类型的运算符(至少从我了解的情况来看)。有没有一种简单的方法来获取用C++打印的字符数?
8
A
回答
5
您可以将自己的streambuf
与cout
联系起来对字符进行计数。
这是用于包装所有的类:
class CCountChars {
public:
CCountChars(ostream &s1) : m_s1(s1), m_buf(s1.rdbuf()), m_s1OrigBuf(s1.rdbuf(&m_buf)) {}
~CCountChars() { m_s1.rdbuf(m_s1OrigBuf); m_s1 << endl << "output " << m_buf.GetCount() << " chars" << endl; }
private:
CCountChars &operator =(CCountChars &rhs) = delete;
class CCountCharsBuf : public streambuf {
public:
CCountCharsBuf(streambuf* sb1) : m_sb1(sb1) {}
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 {
++m_count;
return m_sb1->sputc((streambuf::char_type)c);
}
}
virtual int sync() {
return m_sb1->pubsync();
}
streambuf *m_sb1;
size_t m_count = 0;
};
ostream &m_s1;
CCountCharsBuf m_buf;
streambuf * const m_s1OrigBuf;
};
并且你使用这样的:
{
CCountChars c(cout);
cout << "bla" << 3 << endl;
}
虽然对象实例存在,它计算由COUT所有输出的字符。
请注意,这只会计算通过cout
输出的字符数,而不是使用printf
打印的字符数。
1
您可以创建一个过滤流缓冲区,报告写入的字符数。例如:
class countbuf
: std::streambuf {
std::streambuf* sbuf;
std::streamsize size;
public:
countbuf(std::streambuf* sbuf): sbuf(sbuf), size() {}
int overflow(int c) {
if (traits_type::eof() != c) {
++this->size;
}
return this->sbuf.sputc(c);
}
int sync() { return this->sbuf->pubsync(); }
std::streamsize count() { this->size; }
};
你只使用流缓冲区作为过滤器:
int main() {
countbuf sbuf;
std::streambuf* orig = std::cout.rdbuf(&sbuf);
std::cout << "hello: ";
std::cout << sbuf.count() << "\n";
std::cout.rdbuf(orig);
}
相关问题
- 1. 有没有一种简化的方式来取消在C#中的字符串?
- 2. 有没有一种简单的方法来获取Symfony中的ServerName?
- 3. 有没有一种简单的方法来获取URL中的URL
- 4. TStringGrid - 有没有一种简单的方法来获取“当前/选定”行?
- 5. 有没有简单的方法来克隆字符串数组?
- 6. 有没有一种简单的方法来读取文件并打印到FORTRAN的标准输出?
- 7. 有没有一种简单的方法从C中的字符串数组创建一个字符串?
- 8. 有没有一种简单的方法来创建代码TextBox?
- 9. 有没有一种简单的方法来document.createElement多个元素?
- 10. 有没有简单的方法来打印特定区域的数据
- 11. 有没有简单的方法使用zend_pdf打印文本?
- 12. 有没有一种简单的方法来确定在python中打印的地方?
- 13. 有没有一种简单的方法从Windows Phone中的URI获取查询字符串参数?
- 14. 有没有简单的方法来获取li:gt(-1)在jquery中?
- 15. 有没有一种简单的方法来突变Rust中的枚举字段?
- 16. 有没有一种简单易用的方法来显示高维数据?
- 17. 有没有一种简单的方法来在没有JavaScript的情况下在PHP中获取图像大小?
- 18. 有没有一种简单的方法来将字符串转换为使用vbscript的数学表达式?
- 19. 有没有一种简单的方法来获取objective-c/iPhone-OS中对象的创建者对象?
- 20. 打印字符串的所有变种最有效的方法?
- 21. 有没有一种简单的方法来检查字段是否为null?
- 22. 有没有一种简单的方法来匹配jQuery验证3个字段
- 23. 有没有简单的方法来使用Facebook的C#SDK?
- 24. 有没有一种从GStreamer元素名称获取GType的简单方法?
- 25. 有没有更简单的方法来取消嵌套数组?
- 26. 有没有一种简单的方法来分配结构数组
- 27. 有没有一种简单快捷的方式来生成JavaScript?
- 28. Android:有没有一种简单的方法来查找我的项目中的所有字符串?
- 29. 有没有一种简单的方法来重复一个PHP的MySQL查询?
- 30. 有没有一种简单的方法来实现LINQ来与DataContext对象?
我认为最好的方法是输出到内存缓冲区(用'ostringstream'),指望它,然后将该缓冲区输出到控制台 –
我总是发现复杂的格式可以让老式C函数更轻松。是否有任何特定的原因要避免printf? –
哎呀,对不起。我甚至不知道printf是用C++编写的,认为它必须是cout <<。 – Della