2010-01-27 10 views
5

मैं एक कार्यक्रम चल रहा हूँ और एक outfile को cout पुनः निर्देशित है, तो जैसे:क्या आउटआउट को आउटपुट करने के दौरान रीडायरेक्ट करते समय टर्मिनल पर जाना संभव है?

./program <infile.in> outfile.o 

मैं एक विकल्प में पढ़ने में सक्षम होना चाहता हूँ आदेश से ('-h' या '--help') टर्मिनल को एक सहायता संदेश लाइन और आउटपुट करें। क्या ऐसा कोई तरीका है जो मैं कर सकता हूं लेकिन अभी भी शेष कार्यक्रम से नियमित cout आउटफाइल पर जाना है?

cout सही वस्तु ऐसी बात के लिए उपयोग करने के लिए होगा?

उत्तर

15

आप उत्पादन के लिए STDERR, जो आपके पुनर्निर्देशन में शामिल नहीं है के लिए आपकी मदद संदेश cerr का उपयोग करना चाहिए outfile.o करने के लिए।

को देखते हुए ./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."; 

हैं, तो बाद में, आप दोनों STDOUT और STDERR रीडायरेक्ट करना चाहते हैं, आप कर सकते हैं

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

आप केवल STDERR पुनर्निर्देशित करने के लिए चाहते हैं, लेकिन अनुमति देने के STDOUT करने के लिए प्रदर्शन,

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

Bash redirection अधिक से अधिक जटिल है लोगों को एहसास होता है, और सबसे सरल रूप (">") को छोड़कर अक्सर सबकुछ अनदेखा हो जाता है।

+0

भयानक, मदद के लिए धन्यवाद! – zebraman

0

आपको कोउट के बजाय सीर का उपयोग करना चाहिए। खोल पुनर्निर्देशन का उपयोग करना> केवल stdout (cout) को रीडायरेक्ट करता है, stderr (cerr) नहीं।

1

आप stderr करने के लिए उत्पादन सहायता संदेश को पसंद कर सकते हैं। स्टेडर आमतौर पर गैर-सामान्य आउटपुट के लिए उपयोग किया जाता है और आप इस तरह के आउटपुट होने के लिए उपयोग अनुच्छेद पर विचार कर सकते हैं।

2

~$ cmd | tee log_filestdout dup के लिए दायर करने के लिए और टर्मिनल
~$ cmd 2>log_file एक फ़ाइल में stdout टर्मिनल पर और stderr मुद्रित करने के लिए

1

बातें मेरे द्वारा की गई में से एक - यह नहीं कह यह हमेशा उचित है - मॉड्यूल कि इस हस्ताक्षर की तरह कुछ है लिखने है।

void write_out(ostream &o); 

और फिर मैं fstream वस्तुओं बना सकते हैं और उन में से गुजरती हैं, या अदालत और cerr, जो कुछ भी मैं उस समय की जरूरत है में गुजरती हैं। यह लॉगिंग कोड लिखने में सहायक हो सकता है, जहां कभी-कभी आप टर्मिनल को देखना चाहते हैं कि क्या होता है, और दूसरी बार आप सिर्फ लॉगफाइल चाहते हैं।

एचटीएच।

3

आप लिनक्स पर हैं, तो आप एक नियंत्रित टर्मिनल (यदि हो तो) के उत्पादन के लिए छद्म डिवाइस /dev/tty उपयोग कर सकते हैं। यह तब भी काम करेगा जब stderr रीडायरेक्ट किया गया है साथ ही stdout। अन्य ऑपरेटिंग सिस्टम समान तंत्र प्रदान कर सकते हैं।

उदा।तरीका है कि दो धाराओं के साथ स्वतंत्र रूप से रिश्तेदार आदेश बफ़र किया जा रहा है, तो वे एक ही डिवाइस के लिए outputting रहे हैं जरूरी संरक्षित नहीं है

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

नोट:

#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; 
} 

इस तरह काम करेगा। इसे उचित समय पर धाराओं को फ़्लश करके समायोजित किया जा सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे