2014-11-30 12 views
5

Tôi đang viết mã nơi tôi phải in cùng một dữ liệu trên bảng điều khiển và vào một tệp. Có cách nào để điền một đối tượng luồng đầu ra phổ biến và sau đó hiển thị nó trên bàn điều khiển bằng cách sử dụng cout và xuất nó vào một tệp, sử dụng thư viện fstream và iostream?Có cách nào để tạo một đối tượng luồng đầu ra chung để in trên bảng điều khiển và vào một tệp trong C++ không?

+3

Sử dụng [ 'đẩy mạnh :: iostreams :: tee_device'] (http://www.boost.org/doc/libs/ 1_39_0/libs/iostreams/doc/functions/tee.html). – 0x499602D2

+0

Tôi khuyên bạn nên làm điều này trong môi trường gọi điện. –

Trả lời

6

Chắc chắn. Bạn chỉ cần tạo một bộ đệm luồng phù hợp có thể lưu trữ các bộ đệm luồng khác mà nó ghi vào nội bộ. Sử dụng bộ đệm luồng này, bạn sẽ tạo một số std::ostream bạn đang viết.

Ví dụ, đây là một việc thực hiện đơn giản của phương pháp này:

#include <streambuf> 
#include <ostream> 

class teebuf 
    : public std::streambuf 
{ 
    std::streambuf* sb1_; 
    std::streambuf* sb2_; 

    int overflow(int c) { 
     typedef std::streambuf::traits_type traits; 
     bool rc(true); 
     if (!traits::eq_int_type(traits::eof(), c)) { 
      traits::eq_int_type(this->sb1_->sputc(c), traits::eof()) 
       && (rc = false); 
      traits::eq_int_type(this->sb2_->sputc(c), traits::eof()) 
       && (rc = false); 
     } 
     return rc? traits::not_eof(c): traits::eof(); 
    } 
    int sync() { 
     bool rc(false); 
     this->sb1_->pubsync() != -1 || (rc = false); 
     this->sb2_->pubsync() != -1 || (rc = false); 
     return rc? -1: 0; 
    } 
public: 
    teebuf(std::streambuf* sb1, std::streambuf* sb2) 
     : sb1_(sb1), sb2_(sb2) { 
    } 
}; 

class oteestream 
    : private virtual teebuf 
    , public std::ostream { 
public: 
    oteestream(std::ostream& out1, std::ostream& out2) 
     : teebuf(out1.rdbuf(), out2.rdbuf()) 
     , std::ostream(this) { 
     this->init(this); 
    } 
}; 

#include <fstream> 
#include <iostream> 

int main() 
{ 
    std::ofstream fout("tee.txt"); 
    oteestream tee(fout, std::cout); 
    tee << "hello, world!\n"; 
} 
+1

Bộ đệm luồng tùy chỉnh có thể quá mức ở đây mặc dù. Lưu vào một 'stringstream' và xuất ra rằng hai lần có thể là đủ tốt. Dù sao, tốt nhất. (BTW: Bạn đã có mã nằm xung quanh?) – Deduplicator

+1

@Deduplicator: có, có một giải pháp mà là một PITA để sử dụng và một giải pháp thích hợp mà là tốt đẹp để sử dụng. Gói bộ đệm luồng vào một 'std :: ostream' làm cho bộ đệm luồng tee khá đẹp để sử dụng. ... và, vâng, tôi đã có mã này nằm xung quanh: Tôi không gõ _that_ nhanh :-) –

Các vấn đề liên quan