के रूप में fprintf परिणामों को कैसे प्राप्त करें I C++ में कार्यान्वित एक ओपन-सोर्स यूनिक्स टूल के साथ काम कर रहा हूं, और मुझे कुछ कोड बदलने की आवश्यकता है जो मैं इसे करने के लिए करता हूं। चाहते हैं। मैं अपने पैच को अपस्ट्रीम स्वीकार करने की उम्मीद में सबसे छोटा संभव परिवर्तन करना चाहता हूं। समाधान जो मानक सी ++ में कार्यान्वित करने योग्य हैं और अधिक बाह्य निर्भरता नहीं बनाते हैं उन्हें प्राथमिकता दी जाती है।सी ++: std :: स्ट्रिंग w/o sprintf
यहां मेरी समस्या है। मेरे पास एक सी ++ वर्ग है - चलिए इसे "ए" कहते हैं - जो वर्तमान में फ़ाइल सूचक में अपने भारी स्वरूपित डेटा संरचनाओं को मुद्रित करने के लिए fprintf() का उपयोग करता है। अपने प्रिंट फ़ंक्शन में, यह कई सदस्य वर्गों ("बी" का एक उदाहरण है) के समान रूप से परिभाषित प्रिंट फ़ंक्शंस को बार-बार कॉल करता है। एक और वर्ग सी है जिसमें एक सदस्य std :: string "foo" है जिसे ए के उदाहरण के प्रिंट() परिणामों पर सेट करने की आवश्यकता है। इसे ए
के लिए एक to_str() सदस्य फ़ंक्शन के रूप में सोचें। स्यूडोकोड में:
class A {
public:
...
void print(FILE* f);
B b;
...
};
...
void A::print(FILE *f)
{
std::string s = "stuff";
fprintf(f, "some %s", s);
b.print(f);
}
class C {
...
std::string foo;
bool set_foo(std::str);
...
}
...
A a = new A();
C c = new C();
...
// wish i knew how to write A's to_str()
c.set_foo(a.to_str());
मैं उल्लेख करना चाहिए कि सी काफी स्थिर है, लेकिन इतना कम कोड बेहतर आवश्यक परिवर्तन ए और बी (और एक के आश्रितों के बाकी), प्रवाह के एक राज्य में हैं। वर्तमान प्रिंट (फ़ाइल * एफ) इंटरफ़ेस को भी संरक्षित करने की आवश्यकता है।
बदलें fprintf के लिए कॉल() sprintf के लिए()
- मैं नहीं करनी होगी: मैं) को लागू करने के लिए एक :: to_str (करने के लिए कई दृष्टिकोण, फायदे और नुकसान के साथ प्रत्येक पर विचार किया है किसी भी प्रारूप स्ट्रिंग को फिर से लिखें
- प्रिंट() को फिर से कार्यान्वित किया जा सकता है: fprint (f, this.to_str());
- लेकिन मैं मैन्युअल रूप से आवंटित करने के लिए चार [] रों ग तार का एक बहुत विलय, और अंत में एक std :: स्ट्रिंग के लिए चरित्र सरणी परिवर्तित a.print के परिणामों को पकड़ने के लिए
प्रयास की आवश्यकता होगी() एक स्ट्रिंग धारा
- मैं < < उत्पादन प्रारूप करने के लिए प्रारूप तार के सभी परिवर्तित करने के लिए होता है। कनवर्ट करने के लिए सैकड़ों fprintf() s हैं: - {
- प्रिंट() को फिर से लिखा जाना चाहिए क्योंकि यूनिक्स फ़ाइल हैंडल (हालांकि this guy says it may be possible) से आउटपुट स्ट्रीम बनाने के लिए मुझे कोई मानक तरीका नहीं है।
उपयोग बूस्ट की स्ट्रिंग format library
- अधिक बाहरी निर्भरता। छी।
- स्वरूप की वाक्य रचना printf से काफी अलग है() कष्टप्रद होने के लिए:
printf (format_str, args) -> अदालत < < बढ़ावा :: प्रारूप (format_str)% ARG1% ARG2% आदि
क्यूटी के QString::asprintf()
- एक अलग बाहरी निर्भरता का उपयोग करें।
तो, मैं हर संभव विकल्प समाप्त हो? यदि हां, तो आपको क्या लगता है कि मेरी सबसे अच्छी शर्त है? यदि नहीं, तो मैंने क्या अनदेखा किया है?
धन्यवाद।
हालांकि मैं पहले से ही इस सवाल का जवाब, मैं भी इस परियोजना का कहना चाहते हैं: https://github.com/c42f/tinyformat जो अच्छी तरह से समस्या का हल है, और वास्तव में printf स्वरूपण अंकन प्रजनन का एक बड़ा काम करता है। इन दिनों, मैं अपने पैकेज में कुछ साल पहले विस्तृत किए गए बनामप्रिंट विधि की बजाय सीधे उस पैकेज का उपयोग करता हूं। –