2016-12-29 98 views
8

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?

+2

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 –

+2

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? –

+0

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

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