2010-01-27 19 views
5

Tôi đang chạy một chương trình và chuyển hướng cout một outfile, như vậy:Có thể cout vào terminal trong khi chuyển hướng cout sang outfile không?

./program <infile.in> outfile.o 

Tôi muốn để có thể đọc trong một tùy chọn ('-h' hoặc '--help') từ lệnh dòng và đầu ra một thông báo trợ giúp cho thiết bị đầu cuối. Có cách nào tôi có thể làm điều này nhưng vẫn có thường xuyên cout từ phần còn lại của chương trình đi đến outfile?

Có phải cout là đối tượng phù hợp để sử dụng cho một thứ như vậy không?

Trả lời

15

Bạn nên sử dụng cerr để đầu ra thông điệp giúp đỡ của bạn để stderr, mà không được bao gồm trong chuyển hướng của bạn để outfile.o.

Với ./program <infile.in> outfile.o:

cout << "This writes to STDOUT, and gets redirected to outfile."; 
cerr << "This doesn't get redirected, and displays on screen."; 

Nếu, sau này, bạn muốn chuyển hướng cả stdout và stderr, bạn có thể làm

./program < infile.in &> outfile.o 

Nếu bạn muốn chuyển hướng chỉ stderr, nhưng cho phép STDOUT đến hiển thị, sử dụng

./program < infile.in 2> outfile.o 

Bash redirection phức tạp hơn hầu hết mọi người nhận ra và thường là mọi thứ ngoại trừ biểu mẫu đơn giản nhất (">") bị bỏ qua.

+0

tuyệt vời, cảm ơn sự trợ giúp! – zebraman

0

Bạn nên sử dụng cerr thay vì cout. Sử dụng chuyển hướng shell> chỉ chuyển hướng stdout (cout), chứ không phải stderr (cerr).

1

Bạn có thể muốn xuất thông báo trợ giúp thành stderr. Stderr thường được sử dụng cho đầu ra không bình thường và bạn có thể xem xét một đoạn sử dụng để có đầu ra như vậy.

2

~$ cmd | tee log_file để dup stdout nộp terminal
~$ cmd 2>log_file in stdout vào thiết bị đầu cuối và stderr vào một tập tin

1

Một trong những điều tôi đã làm - không nói điều này luôn phù hợp - viết các mô-đun có thứ gì đó giống chữ ký này.

void write_out(ostream &o); 

Và sau đó tôi có thể tạo đối tượng fstream và truyền vào hoặc chuyển vào cout và cerr, bất cứ điều gì tôi cần tại thời điểm đó. Điều này có thể hữu ích khi viết mã đăng nhập, nơi đôi khi bạn muốn xem trên thiết bị đầu cuối điều gì xảy ra và vào những lúc khác, bạn chỉ muốn một tệp nhật ký.

HTH.

3

Nếu bạn đang sử dụng Linux, bạn có thể sử dụng thiết bị giả /dev/tty để xuất ra một thiết bị đầu cuối điều khiển (nếu có). Điều này sẽ hoạt động ngay cả khi stderr được chuyển hướng cũng như stdout. Các hệ điều hành khác có thể cung cấp các cơ chế tương tự.

Ví dụ:

#include <iostream> 
#include <ostream> 
#include <fstream> 

int main() 
{ 
     std::ofstream term("/dev/tty", std::ios_base::out); 

     term << "This goes to terminal\n"; 
     std::cout << "This goes to stdout\n"; 

     return 0; 
} 

Sẽ làm việc như thế này:

 
$ ./a.out 
This goes to stdout 
This goes to terminal 
$ ./a.out >/dev/null 
This goes to terminal 

Lưu ý cách mà với hai con suối được đệm một cách độc lập thứ tự tương đối nếu họ đang outputting đến cùng một thiết bị không nhất thiết phải bảo tồn. Điều này có thể được điều chỉnh bằng cách xả các luồng vào những thời điểm thích hợp.