मैं कुछ फ़ंक्शन में FILE *
में पास करने का एक तरीका ढूंढ रहा हूं ताकि फ़ंक्शन fprintf
के साथ इसे लिख सके। यह आसान है अगर मैं डिस्क पर वास्तविक फ़ाइल में आउटपुट चालू करना चाहता हूं, तो कहें। लेकिन इसके बजाय मैं सभी आउटपुट को स्ट्रिंग के रूप में प्राप्त करना चाहता हूं (char *
)। एपीआई की तरह मैं चाहता है:एक FILE * स्ट्रीम बनाना जिसके परिणामस्वरूप स्ट्रिंग
/** Create a FILE object that will direct writes into an in-memory buffer. */
FILE *open_string_buffer(void);
/** Get the combined string contents of a FILE created with open_string_buffer
(result will be allocated using malloc). */
char *get_string_buffer(FILE *buf);
/* Sample usage. */
FILE *buf;
buf = open_string_buffer();
do_some_stuff(buf); /* do_some_stuff will use fprintf to write to buf */
char *str = get_string_buffer(buf);
fclose(buf);
free(str);
glibc हेडर दर्शाता है कि एक फ़ाइल वास्तविक पढ़ने और लिखने प्रदर्शन करने के लिए हुक कार्यों के साथ स्थापित किया जा सकता लगते हैं। मेरे मामले में मुझे लगता है कि मैं लेखन हुक को एक लिंक्ड सूची में स्ट्रिंग की एक प्रति संलग्न करना चाहता हूं, और वहां get_string_buffer
फ़ंक्शन होने के लिए जो सूची की कुल लंबाई का आंकलन करता है, इसके लिए स्मृति आवंटित करता है, और फिर प्रत्येक आइटम की प्रतिलिपि बनाता है सही जगह में इसमें।
मैं कुछ ऐसा करने का लक्ष्य रख रहा हूं जिसे do_some_stuff
जैसे किसी फ़ंक्शन में पारित किया जा सके, उस फ़ंक्शन के बिना उसे FILE *
प्राप्त करने के अलावा कुछ भी जानने की आवश्यकता है।
क्या इस तरह का कोई मौजूदा कार्यान्वयन है? यह एक उपयोगी और सी-अनुकूल काम करने जैसा लगता है - मान लीजिए कि मैं FILE
एक्स्टेंसिबिलिटी के बारे में सही हूं।
open_memstream बिल्कुल वही है जो मैं चाहता हूं। मुझे यकीन नहीं है कि यह लिंक-सूची दृष्टिकोण का उपयोग कर रहा है, लेकिन मैं इसके लिए बड़ी मात्रा में नहीं लिखूंगा, इससे कोई फर्क नहीं पड़ता। – Edmund