2009-06-25 24 views

उत्तर

1

उपयोगकर्ता लाल्टो सही है, लेकिन लिनक्स पर, जिस फ़ंक्शन को आप ढूंढ रहे हैं उसे fopencookie कहा जाता है। लिनक्स के लिए सही करने laalto की मिसाल परिणाम में:

int my_writefn(void *cookie, const char *data, int n) { 
    FILE **files = (FILE **)cookie; 
    fwrite(data, n, 1, files[0]); 
    return fwrite(data, n, 1, files[1]); 
} 

int noop(void) { return 0; } 
cookie_io_functions_t my_fns = { 
    (void*) noop, 
    (void*) my_writefn, 
    (void*) noop, 
    (void*) noop 
}; 

FILE *files[2] = ...; 

FILE *f = fopencookie((void *)files, "w", my_fns); 

// ... use f as you like ... 

जब आप f को लिखने, प्रणाली आपके my_writefn समारोह यह डेटा कि fwrite को पारित किया गया था गुजर निष्पादित करेंगे। चीजों को आसान बनाने के लिए, आप भी लाइन उन्मुख अपनी फ़ाइल स्ट्रीम के लिए बफरिंग बदलना चाहते हो सकता है:

setvbuf(f, NULL, _IOLBF, 0); 

कि एक नई पंक्ति जब तक डेटा fwrite के लिए पारित अप बफ़र होगा उत्पादन होता है या किसी भी डेटा किसी से पढ़ा जाता है प्रक्रियाओं से जुड़ी धारा (जैसे stdin)। नोट: आपको sevbuffopencookie के बाद कॉल करना होगा, लेकिन स्ट्रीम से किसी भी डेटा को लिखा जाने से पहले।

मैं लाइन बफरिंग का उपयोग करता हूं क्योंकि मैं आमतौर पर stderr से syslog, या नेटवर्क सॉकेट पर रीडायरेक्ट करने के लिए fopencookie का उपयोग करता हूं, और प्रसंस्करण लाइन उन्मुख डेटा आसान और अधिक कुशल है।

1

आप tee की कार्यक्षमता के समान boost::iostreams के साथ कुछ भी कार्यान्वित कर सकते हैं।

+0

क्या आपके पास सी के लिए एक उदाहरण है? क्योंकि यह कड़ाई से सी ++ है;) – Skurmedel

+0

क्षमा करें शायद – stefanB

2

यह सुनिश्चित नहीं है कि आप क्या चाहते हैं, लेकिन यूनिक्स में 'टी' कुछ समान है।

+0

तो "सी ++" लड़का संशोधित हो जाता है, लेकिन आप "दूसरों के काम पर निर्माण" करने के सुझाव के लिए संशोधित हो जाते हैं। यह सही नहीं है ... – Roboprog

4

पहली बात जो मेरे मन में आई थी वह भी "टीई" थी। तो चलिए popen के साथ सी और खोल गठबंधन करते हैं:

FILE * multi_out; 

multi_out = popen("tee file1.out > file2.out", "w"); 
/* error checks, actual work here */ 
pclose(multi_out); 
/* error checks here */ 

एक यूनिक्स धर्मांध रूप में, मैं आप Windows पर इस कोशिश नहीं कर रहे हैं मान लिया है।

+0

आह, आपने कहा "लिनक्स"। अच्छा लड़का :-) – Roboprog

+0

इस तरह हम दो से अधिक फाइलों को भी लिख सकते हैं। टी के मुश्किल उपयोग की बात सिर्फ। रेफरी। http://www.linuxandlife.com/2013/05/how-to-use-tee-command.html – JagsVG

6

funopen या fwopen का उपयोग करें और अपना खुद का लेखन फ़ंक्शन प्रदान करें जो एकाधिक FILE* एस को लिखता है।

उदाहरण:

FILE *files[2] = ...; 

FILE *f = fwopen((void *)files, my_writefn); 

// ... use f as you like ... 

int my_writefn(void *cookie, const char *data, int n) { 
    FILE **files = (FILE **)cookie; 
    fwrite(data, n, 1, files[0]); 
    return fwrite(data, n, 1, files[1]); 
} 

(त्रुटि निवारण छोड़े गए।)

ध्यान दें कि funopen और fwopen बीएसडी और मानक लिनक्स में नहीं हैं। मुझे पता नहीं है कि लिनक्स-संगत समकक्ष है या नहीं।

+0

स्पष्ट रूप से, नहीं। वे मैन पेजों में नहीं हैं (कम से कम मेरे सिस्टम पर)। – jackhab

+0

funopen बीएसडी और मैक ओएस एक्स पर है। लिनक्स पर fopencookie का उपयोग करें। – mark4o

+0

@ mark4o: जानकारी के लिए धन्यवाद। @ जैक: fopencookie() का उपयोग करके कार्यान्वयन की तरह लगता है काफी समान होगा। यहां मेरा जवाब अपडेट नहीं किया जा रहा है लेकिन आपके पास आगे बढ़ने के लिए कुछ पॉइंटर्स होना चाहिए। – laalto

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