मान लीजिए कि आप एक फ़ाइल नीचे शिकार करने के लिए नई std::filesystem
(या std::experimental::filesystem
) कोड का इस्तेमाल किया है करते हैं। आपके पास path
वैरिएबल है जिसमें इस चर के लिए पूर्ण पथनाम है।फाइल सिस्टम का उपयोग :: पथ, आप क्रॉस-प्लेटफ़ॉर्म तरीके से फ़ाइल कैसे खोलते हैं?
आप उस फ़ाइल कैसे खोलूँ?
कि मूर्खतापूर्ण लग सकता है, लेकिन स्पष्ट जवाब पर विचार करें: काम करने के लिए
std::filesystem::path my_path = ...;
std::ifstream stream(my_path.c_str(), std::ios::binary);
यह इसकी गारंटी नहीं है। क्यूं कर? उदाहरण के लिए विंडोज़ पर, path::string_type
std::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 का अपना संस्करण बढ़ाया।
क्या मुझे यहां कुछ याद आ रही है? क्या समिति ने को फ़ाइलों को खोलने के लिए एक क्रॉस-प्लेटफ़ॉर्म तरीका जोड़ने के बिना एक क्रॉस-प्लेटफ़ॉर्म फाइल सिस्टम लाइब्रेरी जोड़ दी?
विस्तार बहुत मानकीकृत [दोष रिपोर्ट 2676] बनने की संभावना है (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2676)। पिछले हफ्ते हो सकता है। –
'basic_ifstream स्ट्रीम (my_path); 'काम, या क्या मैं वहां कुछ खो रहा हूं? यह निश्चित रूप से सुंदर नहीं है ... –
chris
@chris: नहीं। 'Basic_ifstream' का चरित्र प्रकार * डेटा * के चरित्र प्रकार को संदर्भित करता है जो इसे पढ़ता/लिखता है, न कि पथ के बारे में। –