printf(...)
trả về số lượng ký tự đầu ra cho bảng điều khiển, mà tôi thấy rất hữu ích trong việc thiết kế các chương trình nhất định. Vì vậy, tôi đã tự hỏi nếu có một tính năng tương tự trong C + +, kể từ khi cout < < là một nhà điều hành mà không có một loại trả lại (ít nhất là từ những gì tôi hiểu về nó).Có cách nào đơn giản để lấy số ký tự được in trong C++ không?
8
A
Trả lời
5
Bạn có thể liên kết riêng của mình streambuf
đến cout
để đếm các ký tự.
Đây là lớp học mà kết thúc tốt đẹp lên tất cả:
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;
};
Và bạn sử dụng nó như thế này:
{
CCountChars c(cout);
cout << "bla" << 3 << endl;
}
Trong khi trường hợp đối tượng tồn tại nó đếm tất cả các ký tự đầu ra bởi cout.
Hãy nhớ rằng điều này sẽ chỉ tính các ký tự đầu ra qua cout
, không phải ký tự được in với printf
.
1
Bạn có thể tạo bộ đệm luồng lọc để báo cáo số ký tự được viết. Ví dụ:
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; }
};
Bạn sẽ chỉ cần sử dụng bộ đệm dòng này như một bộ lọc:
int main() {
countbuf sbuf;
std::streambuf* orig = std::cout.rdbuf(&sbuf);
std::cout << "hello: ";
std::cout << sbuf.count() << "\n";
std::cout.rdbuf(orig);
}
Các vấn đề liên quan
- 1. Có thể in các ký tự không in bằng chỉ số% C không?
- 2. cách in các ô của bảng bằng ký tự đơn giản html
- 3. Ký tự unicode C++ in
- 4. Phát hiện nếu ký tự được đơn giản hóa hoặc ký tự Trung Quốc truyền thống
- 5. Có cách nào đơn giản để lấy kích thước hình ảnh trong Ruby không?
- 6. In các ký tự Trung Quốc đơn giản trên Epson TM-T88IVM
- 7. Cách lấy số ký tự trong chuỗi std ::?
- 8. Làm cách nào để lấy một giá trị số đơn giản từ một vector số có tên trong R?
- 9. Cách đơn giản để đếm các ký tự bằng cách sử dụng .keyup trong jQuery
- 10. Làm cách nào để mã một bộ đệm tròn số nguyên đơn giản trong C/C++?
- 11. Có thể sử dụng mệnh đề IN trong sql đơn giản Slick cho số nguyên không?
- 12. Làm cách nào để thay thế các ký tự Unicode không in được trong Java?
- 13. Java: Có cách nào đơn giản để lấy cookie theo tên không?
- 14. Có cách nào giống như C để lấy số mặt hàng từ enum trong java không?
- 15. Có cách nào tốt hơn để in chuỗi có cout tối đa N ký tự không?
- 16. Có cách nào đơn giản để có được kích thước của một đối tượng java không?
- 17. Threading đơn giản trong C#
- 18. Không được in các ký tự được bản địa hóa
- 19. Làm thế nào tôi có thể đơn giản hóa "cho x trong a cho y trong b cho z trong c ..." với số không có thứ tự?
- 20. Cách đơn giản để xóa tất cả các ký tự không phải từ
- 21. Làm cách nào để diễn tả chuỗi ký tự trong một mẫu được tham số hóa theo loại ký tự được sử dụng để biểu diễn chữ?
- 22. Làm cách nào để đơn giản hóa biến "tham số mẫu này" trong C++?
- 23. cách in hex đã ký trong c
- 24. Có cách đơn giản để lấy mã ngôn ngữ từ mã quốc gia trong PHP
- 25. Twig: Cách lấy ký tự đầu tiên trong một chuỗi
- 26. Cách đơn giản nhất để in ra nội dung của trường văn bản trong SQL Server
- 27. Có phương pháp đơn giản nào để chuyển đổi chuỗi số thứ tự sang giá trị số phù hợp không?
- 28. Phát hiện các ký tự không in được trong JavaScript
- 29. In các ký tự thập lục phân trong C
- 30. Có cách nào nhanh chóng để lấy hai ký tự cuối cùng trong một chuỗi không?
Tôi nghĩ rằng đặt cược tốt nhất của bạn là để xuất ra một bộ nhớ đệm (với 'ostringstream'), đếm nó, và sau đó xuất bộ đệm đó vào giao diện điều khiển –
Tôi luôn tìm thấy định dạng phức tạp để dễ dàng hơn với các hàm C cũ của trường. Có lý do cụ thể nào bạn muốn tránh printf không? –
Rất tiếc, xin lỗi. Tôi thậm chí không biết rằng printf hoạt động trong C++, nghĩ rằng nó phải là cout <<. – Della