2009-12-22 30 views
8

फ़ाइल नाम के साथ संपत्ति ट्री बूस्ट मैं boost::PropertyTreeके रूप में कुंजी

हालांकि, में कुंजी के रूप में फ़ाइल नामों का उपयोग करने के लिए कोशिश कर रहा हूँ '।' "example.txt" जैसे फ़ाइल नाम में वर्ण संपत्ति पेड़ के भीतर एक अतिरिक्त परत को जोड़ने का कारण बनता है। सबसे स्पष्ट समाधान '।' को प्रतिस्थापित करना होगा। एक और चरित्र के साथ, लेकिन ऐसा करने का एक बेहतर तरीका है, जैसे कि बचने वाले चरित्र के साथ।

निम्नलिखित उदाहरण में, मान 10 को 'उदाहरण' के बच्चे नोड 'txt' में रखा जाएगा। इसके बजाय, मैं मान 10 को नोड 'example.txt' में संग्रहीत करना चाहता हूं।

ptree pt; 
pt.put("example.txt", 10); 

कैसे मैं एक एकल नोड के लिए पूर्ण फ़ाइल नाम का उपयोग कर सकते हैं?

आपकी मदद के लिए अग्रिम धन्यवाद!

+0

एक तरफ: चाबी के रूप में फ़ाइल नामों का उपयोग करना मुश्किल है। क्या आपने सोचा है कि हार्डलिंक होने पर क्या होता है? प्रतीकात्मक लिंक? आपके प्रक्रिया के बाहर होने वाले नाम बदलते हैं? विंडोज़ पर केस असंवेदनशीलता? तथ्य यह है कि विंडोज़ फ़ाइल नामों में पिछली जगहों को छीनती है? – asveikau

+0

सौभाग्य से यह एक पूर्व शर्त के साथ केवल पढ़ने के लिए है कि निर्देशिका की सामग्री इस ऑपरेशन के दौरान नहीं बदलेगी। हालांकि, मैं आपको अतिरिक्त चिंताओं को इंगित करने की सराहना करता हूं। –

+0

मेरा मुद्दा यह है कि इनमें से कुछ चीजें (लिंक के अस्तित्व की तरह) झूठी नकारात्मकताओं का कारण बन सकती हैं। बस कुछ ध्यान में रखना, खासकर यदि आप किसी प्रकार की सुरक्षा सुविधा के लिए इसका इस्तेमाल करना चाहते थे। – asveikau

उत्तर

5

समस्या यह थी कि दस्तावेज पुराना था। एक रास्ता प्रकार वस्तु एक और चरित्र है कि फ़ाइल पथ के रूप में निम्नानुसार परिसीमक के रूप में निर्दिष्ट के लिए अमान्य है के साथ, इस प्रकार बनाया जाना चाहिए:

pt.put(boost::property_tree::ptree::path_type("example.txt", '|'), 10); 

मैं समाचार समूह gmane पर बढ़ावा मेलिंग सूची से समाधान करने के लिए एक रास्ता मिल गया। फिलिप वाउचर द्वारा पोस्ट comp.lib.boost.devel।

9

बस पेड़ स्पष्ट रूप से सम्मिलित करें:

pt.push_back(ptree::value_type("example.txt", ptree(10))); 

put विधि, सुविधा के लिए होते है जिसके कारण यह स्वचालित रूप से एक अतिरिक्त परत के रूप में . पार्स करता है। वैल्यू टाइप का स्पष्ट रूप से निर्माण करना जैसा मैंने ऊपर दिखाया है, इस समस्या से बचाता है।

समस्या को हल करने का एक वैकल्पिक तरीका put और get में अतिरिक्त तर्क का उपयोग करना है, जो कि डिलीमीटर बदलता है।

pt.put('/', "example.txt", "10"); 
pt.get<string>('/', "example.txt"); 

रिकॉर्ड के लिए, मैंने अपने जीवन में पहले कभी इस कक्षा का उपयोग नहीं किया है। मुझे यह सारी जानकारी सीधे आपके द्वारा लिंक किए गए पृष्ठ से मिली है;)

+0

आपकी लाइन में छोटी गलती, इसे pt.push_back (ptree :: value_type ("example.txt", ptree ("10") होना चाहिए); यह सवाल भी पूछता है, मैं अब इस बच्चे को कैसे प्राप्त करूं कि 'ऑपरेशन' के कारण ऑपरेशन भी विफल हो जाता है। चरित्र, और मैं इसे डेटा वैल्यू के बिना कैसे डालूं जैसे example.txt> wordCount> 10? –

+0

अपने प्रश्न का उत्तर देने के लिए मेरी पोस्ट संपादित की गई। –

+0

दुर्भाग्य से, वैकल्पिक वैकल्पिक डिलीमीटर का समर्थन नहीं करता है। तो pt.put ('/', "example.txt", "10"); का उपयोग नहीं किया जा सकता है। जबकि मैंने '।' के प्रतिस्थापन किया समारोह के बाहर खुद को एक और चरित्र के साथ, ऐसा लगता है कि इसमें बनाया गया है। –

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