क्या दो धाराओं (या फ़ाइल डिस्क्रिप्टर) को एक साथ जोड़ने का कोई तरीका है ताकि एक स्ट्रीम में लिखना दूसरे को भी लिख सके? (सी, लिनक्स)दो धाराओं के साथ एक साथ लिखें
धन्यवाद।
क्या दो धाराओं (या फ़ाइल डिस्क्रिप्टर) को एक साथ जोड़ने का कोई तरीका है ताकि एक स्ट्रीम में लिखना दूसरे को भी लिख सके? (सी, लिनक्स)दो धाराओं के साथ एक साथ लिखें
धन्यवाद।
उपयोगकर्ता लाल्टो सही है, लेकिन लिनक्स पर, जिस फ़ंक्शन को आप ढूंढ रहे हैं उसे 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)। नोट: आपको sevbuf
fopencookie
के बाद कॉल करना होगा, लेकिन स्ट्रीम से किसी भी डेटा को लिखा जाने से पहले।
मैं लाइन बफरिंग का उपयोग करता हूं क्योंकि मैं आमतौर पर stderr से syslog, या नेटवर्क सॉकेट पर रीडायरेक्ट करने के लिए fopencookie
का उपयोग करता हूं, और प्रसंस्करण लाइन उन्मुख डेटा आसान और अधिक कुशल है।
आप tee
की कार्यक्षमता के समान boost::iostreams के साथ कुछ भी कार्यान्वित कर सकते हैं।
यह सुनिश्चित नहीं है कि आप क्या चाहते हैं, लेकिन यूनिक्स में 'टी' कुछ समान है।
तो "सी ++" लड़का संशोधित हो जाता है, लेकिन आप "दूसरों के काम पर निर्माण" करने के सुझाव के लिए संशोधित हो जाते हैं। यह सही नहीं है ... – Roboprog
पहली बात जो मेरे मन में आई थी वह भी "टीई" थी। तो चलिए 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 पर इस कोशिश नहीं कर रहे हैं मान लिया है।
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
बीएसडी और मानक लिनक्स में नहीं हैं। मुझे पता नहीं है कि लिनक्स-संगत समकक्ष है या नहीं।
स्पष्ट रूप से, नहीं। वे मैन पेजों में नहीं हैं (कम से कम मेरे सिस्टम पर)। – jackhab
funopen बीएसडी और मैक ओएस एक्स पर है। लिनक्स पर fopencookie का उपयोग करें। – mark4o
@ mark4o: जानकारी के लिए धन्यवाद। @ जैक: fopencookie() का उपयोग करके कार्यान्वयन की तरह लगता है काफी समान होगा। यहां मेरा जवाब अपडेट नहीं किया जा रहा है लेकिन आपके पास आगे बढ़ने के लिए कुछ पॉइंटर्स होना चाहिए। – laalto
क्या आपके पास सी के लिए एक उदाहरण है? क्योंकि यह कड़ाई से सी ++ है;) – Skurmedel
क्षमा करें शायद – stefanB