2009-11-04 20 views
7

मुझे कुछ प्रिंटों को अलग करने और सामान्य स्टडआउट पर वापस लौटने के लिए अलग-अलग फ़ाइलों को stdout अग्रेषित करने की आवश्यकता थी।फ्रीपेन: मूल स्ट्रीम पर वापस लौटना

मैं freopen इस्तेमाल किया इस तरह से फाइल करने के लिए स्विच करने के लिए:

char name[80]; 
memset(name, 0, 80); 
strcpy(name, "./scripts/asm/"); 
strcat(name, m_func->m_name->m_value); 
strcat(name, ".shasm"); 
freopen(name, "w", stdout); 

और यह वास्तव में काम करता है, लेकिन इस प्रक्रिया के अंत में (ध्यान रखें कि stdout पिछले उसी तरह से कई बार रीडायरेक्ट किया जाता है) मैं मैं इसे मूल stdout पर वापस करने में सक्षम नहीं हूँ। मैंने निम्नलिखित कोशिश की:

freopen("/dev/stdout", "w", stdout); 

लेकिन यह काम नहीं प्रतीत होता है .. केवल जानकारी के लिए मैं मैकोक्स पर विकास कर रहा हूं।

मुझे क्या करना चाहिए?

अग्रिम धन्यवाद

+0

आप कुछ और विवरण जोड़ना चाहेंगे, जब आप अंतिम फ्रीपेन() करते हैं तो क्या होता है? क्या यह वापस लौटता है? – unwind

उत्तर

11

यह fileno, dup और dup2 कॉल का उपयोग करके हासिल किया जा सकता है। मैंने लिनक्स पर यह सुनिश्चित नहीं किया है कि यह मैक पर काम करेगा या नहीं, मुझे यकीन है कि आपको अपने सेटअप के लिए कुछ समकक्ष कार्य मिलेंगे। देखें कि यह नमूना कोड आपके लिए काम करता है या नहीं। कोड में त्रुटि-प्रबंधन की कमी के लिए खेद है। :)

#include <stdio.h> 

    main() 
    { 
     int fd; 
     fpos_t pos; 

     printf("stdout, "); 

     fflush(stdout); 
     fgetpos(stdout, &pos); 
     fd = dup(fileno(stdout)); 
     freopen("stdout.out", "w", stdout); 

     f(); 

     fflush(stdout); 
     dup2(fd, fileno(stdout)); 
     close(fd); 
     clearerr(stdout); 
     fsetpos(stdout, &pos);  /* for C9X */ 

     printf("stdout again\n"); 
    } 

    f() 
    { 
    printf("stdout in f()"); 
    } 
+0

ओएस एक्स पर भी काम करता है। – laalto

+0

@laalto Gr8, इनपुट के लिए धन्यवाद। –

+1

इसे #में शामिल करें और फिर fgetpos/fsetpos कॉल पर वापसी मानों को जांचें लिनक्स पर समस्याएं दिखाती हैं: अगर (fgetpos (stdout, और pos)) perror ("fgetpos"); –

-1

यह आपकी समस्या के हल के लिए एक राउंडअबाउट रास्ते की तरह लगता है। क्यों न केवल fopen() के साथ प्रत्येक फ़ाइल को खोलें और फिर FILE * पर fputs, fprintf, fwrite आदि के साथ क्यों लिखें? Stdout को पुनर्निर्देशित करने की कोई आवश्यकता नहीं है।

+2

शायद क्योंकि एक (बहुत सी) कोड आउटपुट स्ट्रीम निर्दिष्ट किए बिना लिख ​​रहा है, उदा। केवल सादे printf() कॉल का उपयोग कर। Stdout को पुनर्निर्देशित करना उस कोड को "लपेटने" का एक तरीका है और इसे वांछित स्थान पर लिखने के बिना इसे बदलना है। बस, अनुमान लगाया। – unwind

+1

@ अपने अनुमान को सही मानें, यह फ्रीपेन का सबसे अधिक संभावित उपयोग है। –

+0

मैं वास्तव में पुष्टि कर सकता हूं कि यही कारण है। यह एक कंपाइलर है और मैं हमेशा इसे बनाते समय एएसएम कोड (उदाहरण के लिए एमओवी $ 1, 4.5 एफ) प्रिंट करने के लिए printf का उपयोग करता हूं और अब मैं चीजों को बदलने के समय बर्बाद नहीं करना चाहता .. – Jack

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