2011-12-12 36 views
5

Tôi đang sử dụng thư viện được chia sẻ có chức năng đang làm std :: cout ở mọi nơi. Là có thể làm bất cứ điều gì ở cấp độ người gọi, trong đó tôi có thể ngăn chặn cơn cout outout hoặc chuyển hướng nó đến một số địa điểm?Ngăn chặn đầu ra cout với hàm

Thậm chí có thể thử một điều như vậy trong C++ hay không.

+2

Tôi giả sử bạn có thể [freopen] (http://www.cplusplus.com/reference/clibrary/cstdio/freopen/) 'stdout' trước và sau mỗi cuộc gọi tới thư viện được chia sẻ. Hiệu suất và luồng có thể là một mối quan tâm tùy thuộc vào yêu cầu của bạn. – Joe

+1

Bạn có thể sử dụng 'std :: cout.rdbuf()' để chuyển hướng đầu ra sang một tệp, ví dụ. – lapk

+0

Thư viện được chia sẻ này dường như không có chất lượng thương mại. Nếu bạn có mã nguồn cho thư viện này, bạn nên biên dịch lại mã nguồn bằng tính năng ghi nhật ký bị tắt. Một thư viện có trách nhiệm sẽ cho phép điều này xảy ra ở một nơi bằng cách sử dụng một bộ tiền xử lý xác định. – Joe

Trả lời

4

Một cái gì đó như thế này, chỉ cần làm cho hàm bao hàm cho các cuộc gọi thư viện của bạn sẽ chuyển hướng cout.

int main(void) 
{ 
std::ofstream lStream("garbage.txt"); 
std::streambuf* lBufferOld = std::cout.rdbuf(); 

std::cout.rdbuf(lStream.rdbuf()); 
std::cout << "Calling library function" << std::endl; 

std::cout.rdbuf(lBufferOld); 
std::cout << "Normal output" << std::endl; 

std::cout.rdbuf(lStream.rdbuf()); 
std::cout << "Calling another library function" << std::endl; 

std::cout.rdbuf(lBufferOld); 
std::cout << "Another normal output" << std::endl; 

lStream.close(); 

return (0); 
} 
+1

là có bất kỳ sự khác biệt hiệu suất giữa việc sử dụng rdbuf và freeopen? Cái nào sẽ là cách tiếp cận tốt hơn? – Jithin

+0

@Jithin Hiểu biết của tôi là 'cout' cần được chuyển hướng trước mỗi cuộc gọi hàm của thư viện, không chỉ một lần. Trong trường hợp đó 'rdbuf()' là nhanh nhất, tôi nghĩ, - nó đơn giản đặt một con trỏ, sau khi mở tập tin một lần. Nếu 'cout' cần được chuyển hướng chỉ một lần, thì cả hai cách (' rdbuf' hoặc 'freopen') đều giống nhau. – lapk

0

Bạn luôn có thể lọc tất cả I/O bằng cách tạo một lớp để xử lý đầu ra. Do lớp có thể được sử dụng trong toàn bộ ứng dụng, một lớp tĩnh có thể theo thứ tự, nhưng bạn có thể khởi tạo một thể hiện của lớp khi cần thiết.

Ngoài việc viết một cái gì đó hay không để cout hoặc thậm chí chọn một đầu ra khác, dựa trên chuỗi đối số, lớp cũng có thể định dạng văn bản dựa trên loại đầu ra được chọn.

Tôi đã xem ostream và ngoại tuyến không thấy bất kỳ cách nào bạn có thể sửa đổi trực tiếp cout. Bạn đã gặp phải một nhu cầu đã xuất hiện trước đây, vì vậy hy vọng người khác đọc bài này có thể có ý tưởng tốt hơn về việc tạo lớp tôi đã đề xuất.

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