2016-06-30 3 views
15

मान लीजिए कि आप एक फ़ाइल नीचे शिकार करने के लिए नई std::filesystem (या std::experimental::filesystem) कोड का इस्तेमाल किया है करते हैं। आपके पास path वैरिएबल है जिसमें इस चर के लिए पूर्ण पथनाम है।फाइल सिस्टम का उपयोग :: पथ, आप क्रॉस-प्लेटफ़ॉर्म तरीके से फ़ाइल कैसे खोलते हैं?

आप उस फ़ाइल कैसे खोलूँ?

कि मूर्खतापूर्ण लग सकता है, लेकिन स्पष्ट जवाब पर विचार करें: काम करने के लिए

std::filesystem::path my_path = ...; 
std::ifstream stream(my_path.c_str(), std::ios::binary); 

यह इसकी गारंटी नहीं है। क्यूं कर? उदाहरण के लिए विंडोज़ पर, path::string_typestd::wstring है। तो path::c_str एक const wchar_t* वापस करेगा। और std::ifstreamकेवलconst char* प्रकार के साथ पथ ले सकते हैं।

अब यह पता चला है कि इस कोड को वास्तव में बनाम में कार्य करेंगे क्यूं कर? क्योंकि विजुअल स्टूडियो में library extension that does permit this to work है। लेकिन यह गैर मानक व्यवहार है और इसलिए पोर्टेबल नहीं है। उदाहरण के लिए, मुझे नहीं पता कि विंडोज़ पर जीसीसी एक ही सुविधा प्रदान करता है या नहीं।

आप इस कोशिश कर सकते:

std::filesystem::path my_path = ...; 
std::ifstream stream(my_path.string().c_str(), std::ios::binary); 

केवल विंडोज हमें फिर से घालमेल कर दिया है। क्योंकि यदि my_path यूनिकोड वर्णों को शामिल करने के लिए हुआ, तो अब आप विंडोज एएनएसआई लोकेल सामान को सही तरीके से सेट करने पर निर्भर हैं। और यहां तक ​​कि यह आपको जरूरी नहीं बचाएगा यदि पथ में कई भाषाओं के पात्र होते हैं जो एक ही एएनएसआई लोकेल में मौजूद नहीं हो सकते हैं।

बूस्ट फ़ाइल वास्तव में एक ऐसी ही समस्या थी। लेकिन उन्होंने path एस का समर्थन करने के लिए iostreams का अपना संस्करण बढ़ाया।

क्या मुझे यहां कुछ याद आ रही है? क्या समिति ने को फ़ाइलों को खोलने के लिए एक क्रॉस-प्लेटफ़ॉर्म तरीका जोड़ने के बिना एक क्रॉस-प्लेटफ़ॉर्म फाइल सिस्टम लाइब्रेरी जोड़ दी?

+1

विस्तार बहुत मानकीकृत [दोष रिपोर्ट 2676] बनने की संभावना है (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2676)। पिछले हफ्ते हो सकता है। –

+0

'basic_ifstream स्ट्रीम (my_path); 'काम, या क्या मैं वहां कुछ खो रहा हूं? यह निश्चित रूप से सुंदर नहीं है ... – chris

+0

@chris: नहीं। 'Basic_ifstream' का चरित्र प्रकार * डेटा * के चरित्र प्रकार को संदर्भित करता है जो इसे पढ़ता/लिखता है, न कि पथ के बारे में। –

उत्तर

7

बो पेरसन ने कहा कि यह एक standard library defect report का विषय है। इस दोष को हल कर दिया गया है, और सी ++ 17 जहाज जाएगा, कार्यान्वयन की आवश्यकता है जहां path::value_typechar नहीं है, ताकि उनके फ़ाइल स्ट्रीम प्रकार संस्करणों को const char* संस्करणों के अतिरिक्त ले सकें।

+2

यह नहीं है। हालांकि यह संभवतः सी ++ 17 प्रकाशित होने से पहले तय किया जाएगा। –

+0

खोला गया: 2017-03-09 (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2943) –

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