2015-04-24 3 views
6

string streams पर जीएनयू प्रलेखन के माध्यम से पढ़ते समय मैं दो समान कार्य है कि बहुत समान काम करते पाया:fmemopen और open_memstream के बीच क्या अंतर है?

FILE * fmemopen (void *buf, size_t size, const char *opentype) 
FILE * open_memstream (char **ptr, size_t *sizeloc) 

प्रलेखन पढ़ने से, यह open_memstream इनपुट के लिए एक आउटपुट स्ट्रीम और fmemopen खोलने के लिए इस्तेमाल किया जाना चाहिए लगता है। मुझे क्या पकड़ता है opentype तर्क है कि आप fmemopen पर जा सकते हैं।

linux manpage explains:

buf शून्य के रूप में निर्दिष्ट किया जाता है, तो fmemopen() गतिशील रूप से एक बफर आकार आवंटित लंबे बाइट्स। यह एक ऐसे अनुप्रयोग के लिए उपयोगी है जो अस्थायी बफर को डेटा लिखने के लिए चाहता है और फिर इसे फिर से पढ़ें। स्ट्रीम बंद होने पर बफर स्वचालित रूप से मुक्त हो जाता है। ध्यान दें कि कॉलर के पास इस कॉल द्वारा आवंटित अस्थायी बफर पर पॉइंटर प्राप्त करने का कोई तरीका नहीं है (लेकिन नीचे open_memstream() देखें)।

तो क्या open_memstreamfmemopen यदि का उपयोग कर एक इनपुट/आउटपुट धारा खोलने संभाल कर सकते हैं की बात हो सकता है?

उत्तर

10

fmemopen के साथ, बफर को खुले या उससे पहले आवंटित किया जाता है, और बाद में आकार नहीं बदलता है। यदि आप इसे लिखने जा रहे हैं, तो आपको यह जानना होगा कि आपका आउटपुट शुरू होने से पहले कितना बड़ा होगा। open_memstream के साथ जब आप लिखते हैं तो बफर बढ़ता है।

+0

आह, मैं देख रहा हूँ। अच्छी अंतर्दृष्टि, fmemopen के लिए मैन पेज में स्पष्ट रूप से कहा नहीं गया है लेकिन अब मुझे लगता है कि यह निहित है। –

2

open_memstream के लिए FILE* लिखने-केवल

POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/open_memstream.html

इन कार्यों सिवाय इसके कि स्मृति हमेशा समारोह से गतिशील रूप से आवंटित किया जाता है) fmemopen के समान (हैं, और धारा है केवल आउटपुट के लिए खोला गया।

तो गतिशील आवंटन के अलावा दूसरा अंतर है: फ़ाइल केवल लेखन के लिए खोली गई है। (और चूंकि आप खुले धाराओं के झंडे को बदल नहीं सकते, तो आप नहीं स्ट्रीम से पढ़ने में सक्षम होना चाहिए।)

हालांकि ऐसा लगता है कुछ कार्यान्वयन इस अनुमति दे सकते हैं: Can I read stream produced by open_memstream()?

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