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?
Trả lời
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";
}
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
@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 :-) –
- 1. Làm cách nào để viết đầu ra ở cùng một vị trí trên bảng điều khiển?
- 2. có cách nào để chuyển hướng đầu vào và đầu ra đến cùng một tệp không?
- 3. cscript - đầu ra in trên cùng một dòng trên bảng điều khiển?
- 4. Làm cách nào để in thuộc tính của đối tượng vào Bảng điều khiển gỡ lỗi trong Xcode?
- 5. Có cách nào để in trên bảng điều khiển trong ứng dụng Android không?
- 6. Làm cách nào để kết nối đầu ra của bảng điều khiển Java thành tệp?
- 7. XCode 8 (Swift) Không có đầu ra in nào trong Bảng điều khiển
- 8. Làm cách nào để in một chuỗi vào bảng điều khiển mà không có dòng mới ở cuối?
- 9. Làm cách nào để đệm luồng đầu vào/đầu ra/tệp Java của tôi đúng cách?
- 10. C++ kết nối luồng đầu ra với luồng đầu vào
- 11. Tạo đối tượng Theo một tệp đầu vào
- 12. Làm thế nào tôi có thể viết đầu ra màu nhanh vào Bảng điều khiển?
- 13. Làm thế nào để bạn chìm đầu vào và đầu ra vào một tệp văn bản trong R?
- 14. Có lệnh LaTeX nào sẽ đăng nhập vào bảng điều khiển đầu ra/lỗi không?
- 15. Sybase - Đặt đầu ra của bảng điều khiển để in báo cáo nhật ký
- 16. Điều khiển hiển thị trên một bảng điều khiển khác
- 17. Không có đầu ra bàn điều khiển trên cout
- 18. In một mảng các mảng trên một dòng trong bảng điều khiển (một dòng trên một đối tượng mảng chính) trong Ruby
- 19. In vào thiết bị đầu cuối bảng điều khiển không vào đầu ra của máy tính xách tay IPython
- 20. Ứng dụng bảng điều khiển Python - đầu ra ở trên dòng đầu vào
- 21. C#: Chuyển đổi mảng byte thành chuỗi và in ra bảng điều khiển
- 22. 'Điều này' có được bảo đảm để trỏ đến sự khởi đầu của một đối tượng trong C++ không?
- 23. Làm thế nào để tạo ra một điều khiển nhanh chóng Datagrid WPF từ đầu?
- 24. Bàn điều khiển C# - ẩn đầu vào từ cửa sổ bảng điều khiển trong khi nhập
- 25. Bắt đầu quy trình trong cùng một bảng điều khiển
- 26. OpenGL vẽ một phần đối tượng trong bảng điều khiển có thể cuộn
- 27. Bạn có thể ghi vào luồng đầu vào và đầu ra của ổ cắm cùng một lúc không?
- 28. Có cách nào để tạo ra một đối tượng ẩn danh trong PHP
- 29. Viết đầu ra sqlplus vào một tệp
- 30. làm cách nào để tìm kiếm một đối tượng bằng ObjectId của nó trong bảng điều khiển?
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
Tôi khuyên bạn nên làm điều này trong môi trường gọi điện. –