2009-07-24 15 views
5

क्या सी/सी ++ में अपनी खुद की कस्टम स्ट्रीम FILE (stdio.h) बनाने के लिए संभव है उदाहरण के लिए fputs() के साथ उपयोग किया जा सकता है?कस्टम फ़ाइल प्रकार सी/सी ++

+1

आप कौन सी भाषा का उपयोग कर रहे हैं, सी या सी ++? –

+0

मैं सी ++ एपीआई का उपयोग कर रहा हूं जिसके लिए एक फ़ाइल * तर्क के रूप में आवश्यक है। –

+0

http://stackoverflow.com/questions/539537/memory-buffer-as-file/539608#539608 - क्या इससे मदद मिलती है? –

उत्तर

5

यदि आपकी "कस्टम स्ट्रीम" ऐसा कुछ नहीं है जिसे आप फ़ाइल डिस्क्रिप्टर या फ़ाइल हैंडल के साथ प्रस्तुत कर सकते हैं, तो आप भाग्य से बाहर हैं। FILE प्रकार कार्यान्वयन-परिभाषित है, इसलिए अन्य चीज़ों को एक साथ जोड़ने का कोई मानक तरीका नहीं है।

यदि आप जो भी लिख रहे हैं, उसके लिए सी फ़ाइल डिस्क्रिप्टर प्राप्त कर सकते हैं, तो आप इसे fdopen पर कॉल कर सकते हैं ताकि इसे FILE* में बदल दिया जा सके। यह मानक सी या सी ++ नहीं है, लेकिन यह Posix द्वारा प्रदान किया गया है। विंडोज़ पर, यह _fdopen लिखा गया है।

यदि आप विंडोज का उपयोग कर रहे हैं और आपके पास HANDLE है, तो आप इसके साथ फ़ाइल डिस्क्रिप्टर को जोड़ने के लिए _open_osfhandle का उपयोग कर सकते हैं और फिर वहां से _fdopen का उपयोग कर सकते हैं।

क्या आप वास्तव में fputs से बंधे हैं? यदि नहीं, तो इसे C++ IOStream के उपयोग से प्रतिस्थापित करें। फिर आप std::basic_streambuf के अपने वंशज को प्रदान कर सकते हैं, इसे std::ostream में लपेटें, और उस पर मानक सी ++ I/O का उपयोग करें।

+0

बहुत बहुत धन्यवाद, यह काम करता है: CreatePipe() + _open_osfhandle() + fdopen() –

6

नहीं, यह नहीं है। FILE एक अपारदर्शी प्रकार के रूप में जाना जाता है - इसमें कुछ भी नहीं है जिसे आप अनुकूलित कर सकते हैं।

+0

फिर विंडोज़ डिस्क पर फ़ाइलों, नेटवर्क पर फ़ाइलों, वर्चुअल फाइलों को कैसे संभाल सकता है ...? कुछ पहलू कस्टमाइज़ करने योग्य होना चाहिए। – xtofl

+1

फिर एक नाम दें। फ़ाइल प्रकार के पास एप्लिकेशन प्रोग्रामर के लिए कोई सदस्य उपलब्ध नहीं है। –

+0

@xtofl: क्योंकि FILE * विंडोज मैप्स पर हैंडल पर CreateFile द्वारा लौटाया गया है। फ़ाइल * "अनुकूलन" नहीं करता – MSalters

0

यह संभव है। लेकिन आपको मानक पुस्तकालयों के आने वाले लोगों के बजाय अपने एप्लिकेशन को fputs(), आदि के अपने संस्करण से लिंक करना चाहिए। अधिकांश कंपाइलर्स मानक आईओ पुस्तकालयों को डिफ़ॉल्ट रूप से लिंक करते हैं। आपको यह पता लगाना होगा कि इसके आसपास कैसे जाना है।

+2

वह fputs() को फिर से लिखना नहीं चाहता है, वह फ़ाइल को विशेषज्ञ बनाना चाहता है। या कम से कम यह मेरी पढ़ाई है। –

+0

अगर मैं अपने स्वयं के fputs() को परिभाषित करता हूं, तो fputs() का कोई भी कॉल मेरे fputs के माध्यम से जाएगा। –

1

FILE इंटरफ़ेस के साथ कोई मानक तरीका नहीं है। ध्यान दें कि सी ++ कोड को आईओएसट्रीम इंटरफ़ेस के साथ आईओएस के लिए आईओएसट्रीम का उपयोग करना चाहिए, एक कस्टम स्ट्रीमबफ लिखना आपकी समस्या का समाधान है।

यदि आप मानक अनुरूपता छोड़ सकते हैं, तो अपने कार्यान्वयन के दस्तावेज़ीकरण को देखें।

  • पीओएसईक्स में एक पॉपन() फ़ंक्शन है जो एक फ़ाइल * आउटपुट से पढ़ रहा है या प्रक्रिया के इनपुट में लिख रहा है;

  • POSIX में एक fdopen() है जो फ़ाइल डिस्क्रिप्टर से फ़ाइल * बनाने में सक्षम है;

  • लिनक्स द्वारा उपयोग किए जाने वाले जीएनयू libc के लिए कम से कम, कस्टम सी स्ट्रीम को परिभाषित करने की संभावना है (जानकारी दस्तावेज में "अपने आयन कस्टम स्ट्रीम" प्रोग्राम देखें)।

+0

पॉपन कैसे होता है (0 समस्या का समाधान करें? –

+0

हम सुनिश्चित करने के लिए समस्या के बारे में पर्याप्त नहीं जानते हैं। हम जानते हैं कि उसे एक एपीआई में एक फ़ाइल * पास करनी है। दो या दो से अधिक प्रक्रियाओं में अपने प्रोग्राम को व्यवस्थित करना एक हो सकता है समाधान (एक प्रक्रिया को उत्पन्न करना जो एक पॉपन() करता है और फिर उदाहरण के लिए एपीआई को कॉल करता है)। – AProgrammer

+0

मैं देखता हूं, सुझाव के लिए धन्यवाद, लेकिन मैं ऐसा नहीं कर सकता। मेरे द्वारा उपयोग किए जाने वाले एपीआई में भी तर्क के रूप में संदर्भ है और यह इस समाधान को लागू करना बहुत मुश्किल हो सकता है। –

3

आप GNU सी पुस्तकालय के साथ संकलन रहे हैं, तो आप (3) fmemopen इस्तेमाल कर सकते हैं:

fmemopen, खुले _ memstream, खुले _ wmemstream - धारा के रूप में खुला स्मृति

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