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. 有沒有一種簡單的方法來獲取URL中的URL
- 3. 有沒有一種簡單的方法來獲取Symfony中的ServerName?
- 4. TStringGrid - 有沒有一種簡單的方法來獲取「當前/選定」行?
- 5. 有沒有一種簡單的方法來重構C#中的參數?
- 6. 有沒有簡單的方法來克隆字符串數組?
- 7. 有沒有一種簡單的方法來讀取文件並打印到FORTRAN的標準輸出?
- 8. 有沒有一種「簡單」的方式來獲取mod_wsgi來反映Django更新?
- 9. 有沒有一種簡單的方法來獲取日期字符串中的紅寶石年?
- 10. 有沒有一種簡單的方法從C中的字符串數組創建一個字符串?
- 11. 有沒有一種簡單的方法來通過`imgCounter.src =`
- 12. 有沒有一種簡單的方法來創建代碼TextBox?
- 13. 有沒有一種簡單的方法來document.createElement多個元素?
- 14. 有沒有簡單的方法來找到一個數字
- 15. 有沒有簡單的方法來打印特定區域的數據
- 16. 有沒有簡單的方法使用zend_pdf打印文本?
- 17. 有沒有一種簡單的方法來確定在python中打印的地方?
- 18. 有沒有一種簡單的方法來獲得android APK的外部屬性?
- 19. 有沒有一種簡單的方法從Windows Phone中的URI獲取查詢字符串參數?
- 20. 有沒有簡單的方法來獲取日期?
- 21. 有沒有簡單的方法來獲取li:gt(-1)在jquery中?
- 22. 有沒有一種簡單的方法來突變Rust中的枚舉字段?
- 23. 有沒有一種簡單易用的方法來顯示高維數據?
- 24. 有沒有一種簡單的方法來使用SpriteKit計算小數?
- 25. 有沒有一種簡單的方法從ActiveRecord獲取PGconn的實例?
- 26. 有沒有一種簡單的方法來在沒有JavaScript的情況下在PHP中獲取圖像大小?
- 27. 有沒有一種簡單的方法來將我所有的字符串轉換爲對strings.xml的引用
- 28. 有沒有一種簡單的方法來獲取objective-c/iPhone-OS中對象的創建者對象?
- 29. 有沒有一種簡單的方法來將字符串轉換爲使用vbscript的數學表達式?
- 30. 打印字符串的所有變種最有效的方法?
我認爲最好的方法是輸出到內存緩衝區(用'ostringstream'),指望它,然後將該緩衝區輸出到控制檯 –
我總是發現複雜的格式可以讓老式C函數更輕鬆。是否有任何特定的原因要避免printf? –
哎呀,對不起。我甚至不知道printf是用C++編寫的,認爲它必須是cout <<。 – Della