2010-02-23 10 views
10

का उपयोग कर विंडोज के तहत यूनिकोड फ़ाइल नाम के साथ फ़ाइल के साथ fstream खोलना मुझे फ़ाइल नाम "यूनिकोड" फ़ाइल नाम होने पर std :: fstream (या वास्तव में कोई अन्य std :: ostream) के रूप में फ़ाइल खोलने की आवश्यकता है।गैर-एमएसवीसी कंपाइलर

एमएसवीसी के तहत मेरे पास गैर-मानक एक्सटेंशन std::fstream::open(wchar_t const *,...) है? जीसीसी (सबसे महत्वपूर्ण) और शायद बोर्लैंड कंपाइलर जैसे अन्य कंपाइलर्स के साथ मैं क्या कर सकता हूं।

मुझे पता है कि CRTL _wfopen प्रदान करता है, लेकिन यह सी कब-धाराओं के बजाय FILE * इंटरफ़ेस देता है, हो सकता है कि वहाँ एक गैर मानक तरीका FILE * से कब-स्ट्रीम बनाने के लिए है? क्या MSV के साथ विंडोज़ के विस्तार के साथ कोई boost::ifstream है?

+0

आप नहीं कर सकते। मैक ओएस एक्स पर यह निर्णय लिया गया था कि POSIX फ़ाइल एपीआई - और इसलिए std :: fstream - सभी utf-8 ले लेंगे। ऐसे वातावरण में जहां प्लेटफ़ॉर्म विशिष्ट सीमाएं नहीं हैं (जैसे कि विंडोज़ पर जीसीसी और बीसी (वास्तव में, उनके पास अपने स्वयं के एक्सटेंशन हो सकते हैं, लेकिन यह पीओएसईक्स मानक के बाहर होगा)) सी और सी ++ रनटाइम फ़ंक्शंस को विश्वसनीय रूप से उम्मीद नहीं की जा सकती है फाइल सिस्टम को उन फ़ाइलों को एक्सेस करें जिनके नाम में गैर एएससीआई वर्ण हैं। –

+0

@ क्रिस मुझे पुस्तकालय के साथ कोई समस्या नहीं है जो यूटीएफ -8 का समर्थन करता है - यह मेरे लिए सही है। मुद्दा यह है कि विंडोज यूटीएफ -8 – Artyom

+0

का समर्थन नहीं करता है, मिनीजीडब्लू के लिए हैकिश वर्कअराउंड http://stackoverflow.com/questions/6524821/opening-stream-via-function – marcin

उत्तर

3

वर्तमान में कोई आसान समाधान नहीं है।

आपको अपना खुद का स्ट्रीम बफर बनाना होगा जो हुड के नीचे _wfopen का उपयोग करता है। उदाहरण के लिए आप इसका उपयोग कर सकते हैं उदाहरण के लिए boost::iostream

-3

यूनिकोड फ़ाइल नाम को स्ट्रिंग में wcstombs() या WideCharToMultiByte() (जो आपको शामिल कोडपेज पर अधिक नियंत्रण देता है) का उपयोग करके कनवर्ट करें।

फिर फ़ाइल खोलने के लिए परिवर्तित फ़ाइल नाम का उपयोग करें।

+4

फ़ाइल नाम में यूनिकोड वर्ण शामिल हैं जिन्हें वर्तमान में प्रदर्शित नहीं किया जा सकता है लोकेल कोडपेज (यानी लैटिन 1 8-बिट लोकेल में हिब्रू वर्णों का प्रतिनिधित्व नहीं किया जा सकता है), विंडोज भी यूटीएफ -8 कोड पृष्ठों का समर्थन नहीं करता है। तो नहीं, यह काम नहीं करता है। – Artyom

7

दुर्भाग्यवश, ऐसा करने का कोई मानक तरीका नहीं है, हालांकि सी ++ 0x (1x?) ऐसा करने का वादा करता है। तब तक, आपने सही ढंग से माना कि बूस्ट में एक समाधान पाया जा सकता है, हालांकि, जिस लाइब्रेरी को आप खोज रहे हैं वह Boost.Filesystem है।

बूस्ट। फ़िलीसिस्टम आंतरिक रूप से सार्वभौमिक पथ प्रणाली के लिए डिफ़ॉल्ट रूप से विस्तृत तारों का उपयोग करता है, इसलिए इस संबंध में कोई यूनिकोड समस्या नहीं है।

+0

क्या आपके पास सी ++ 0 एक्स का संदर्भ है? मुझे चर्चाएं याद हैं लेकिन कोई निष्कर्ष नहीं मिला और मुझे नवीनतम मसौदे में कुछ भी नहीं मिला। – AProgrammer

+4

समस्या यह है कि 'बूस्ट :: फाइल सिस्टम' मिनीजीडब्ल्यू/जीसीसी के तहत wpath का समर्थन नहीं करता है क्योंकि बूस्ट कॉन्फ़िगरेशन किसी कारण से 'BOOST_NO_STD_WSTRING' को परिभाषित करता है (यहां तक ​​कि विस्तृत स्ट्रिंग्स मिंगव के तहत काफी अच्छी तरह से काम करती हैं) – Artyom

+0

मैंने थोड़ा और खोज लिया है और यह पाया है : http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#454, स्पष्ट रूप से लाइब्रेरी TR2 से पहले कोई समाधान नहीं है। – AProgrammer

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