2012-06-06 15 views
5

सी ++ आईओ धाराओं का कौन सा हिस्सा \r से \r\n रूपांतरण करता है? क्या यह stream_buf है या क्या यह codecvt पहलू द्वारा बाहरी एन्कोडिंग रूपांतरण के आंतरिक का हिस्सा है?धाराएं, stream_bufs, codecvt facets और n to r n अनुवाद

UPDATE 1

आप सभी का कहना है कि यह streambuf/filebuf में किया जाता है। ठीक। लेकिन यह व्यवस्था कैसे यूटीएफ -16 जैसी बाह्य एन्कोडिंग के साथ सौदा करती है? तब ऐसा लगता है कि फ़ाइल को ios::binary ध्वज के साथ खोला जाना है जो अनुवाद को अक्षम करता है।

+1

क्या यह '\ n'' \ r \ n' रूपांतरण नहीं होना चाहिए? आम तौर पर आपको पोर्टेबल कोड से क्या मिलेगा एक '\ n' है और आपको" विंडोज़ जैसे "प्रस्तुतियों के लिए लाइन फीड प्रीपेड करने की आवश्यकता है। –

+0

अतिरिक्त '\ r' को प्रीपेड करने के लिए प्रयुक्त वर्ण एन्कोडिंग के साथ कुछ लेना देना नहीं है, यह अभी भी एक अतिरिक्त चरित्र है। कुछ टर्मिनल के लिए कॉलम 0 पर शुरू करने के लिए '\ r' टर्मिनल लिखने वाले कर्सर को नियंत्रित करता है। 'codecvt' नियंत्रित करता है कि एक वर्ण को एन्कोड करने के लिए कितने बाइट्स का उपयोग किया जाता है। –

उत्तर

2

यह रूपांतरण स्ट्रीम (स्ट्रीमबफ, या पहलू द्वारा नहीं किया जाता है) आमतौर पर नहीं किया जाता है। सी जिम्मेदारी सी पुस्तकालय कोड (उदा। fputc()) है जिसे स्ट्रीमबफ के overflow() और underflow() द्वारा बुलाया जाता है।

आप किसी कारण (जैसे जब एक dos2unix दिनचर्या को लागू करने) के लिए इसकी आवश्यकता है, वहाँ में boost.iostreams.

संपादित एक आसान उदाहरण है: std::filebuf केवल पाठ फ़ाइलें, जैसे UTF-8 या GB18030 या जो कुछ भी के लिए multibyte एन्कोडिंग का समर्थन करता है लोकेल का उपयोग करता है। एक यूटीएफ -16 फाइल को बाइनरी मोड में खोला जाना होगा, एक सादे बाइट स्ट्रीम (जिसे सी ++ 11 के कोडकैट सुविधाओं के साथ यूटीएफ -16 के रूप में व्याख्या किया जा सकता है), और हाँ लाइन एंडिंग परिवर्तित नहीं हो पाएंगे।

+0

स्ट्रीमबफ कार्यान्वयन को आवश्यक रूप से fputc() का उपयोग करने की आवश्यकता नहीं है, यह संदर्भ पर निर्भर करता है। हमारे पास स्ट्रीमबफ के लिए कार्यान्वयन है जो डीबगिंग उद्देश्यों के लिए सीधे यूएआरटी पर आउटपुट करता है, (आरटी) ओएस प्रयुक्त फ़ाइल हैंडल भी प्रदान नहीं करता है, तो fputc() का उपयोग कैसे करें ?? –

+0

@ g-makulik विशेष रूप से 'std :: cout' द्वारा उपयोग किए जाने वाले स्ट्रीमबफ को उसी अंतर्निहित बफर का उपयोग करने की आवश्यकता होती है, जिसे 'stdout' पर लिखते समय सी I/O उपयोग करता है, इसलिए यह गैर-मानक होगा। फाइलबफ और अन्य स्ट्रीमबफ के लिए, ठीक है, यही मेरा "आमतौर पर" था। – Cubbi

1

IFAIR यह स्ट्रीमबफ कार्यान्वयन में किया गया है, codecvt बस लोकेल प्रतिनिधित्व विनिर्देशों से संबंधित है।

+0

एरिक मालेनफैंट के उत्तर के समान टिप्पणी: यह फाइलबफ में क्यों किया जाता है? क्या इसका मतलब यह नहीं है कि फाइलबफ को कोडेकैट पहलू द्वारा प्रदान किए गए बाहरी एन्कोडिंग का कुछ ज्ञान होना चाहिए? – wilx

+0

इसमें चरित्र एन्कोडिंग आईएमएचओ के साथ कुछ लेना देना नहीं है, लेकिन ओएस टर्मिनल डिस्प्ले में लाइन एंडिंग कैसे संभालता है। –

1

यह std :: filebuf द्वारा किया जाता है, अगर यह आईओएस :: बाइनरी ध्वज के बिना खुला था।

+0

यह 'filebuf' में क्यों किया जाता है? क्या इसका मतलब यह नहीं है कि 'filebuf' को' codecvt' facet द्वारा प्रदान किए गए बाहरी एन्कोडिंग का कुछ ज्ञान होना चाहिए? – wilx

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