एक स्ट्रीम मैनिपुलेटर (एंडल) या एक नयालाइन एस्केप चरित्र (\ n) का उपयोग करना?


12

मेरे पास कोई विशिष्ट संदर्भ नहीं है जिसमें मैं प्रश्न पूछ रहा हूं, लेकिन जब मैं सी ++ पर एक शुरुआती पुस्तक पढ़ रहा था तो मैंने एक स्ट्रीम ऑब्जेक्ट के साथ काम करते समय एंडल स्ट्रीम मैनिपुलेटर और एक न्यूलाइन एस्केप चरित्र दोनों का उपयोग किया।

निर्गमन निम्नानुसार है:

cout << "Hello World" << endl;
cout << "Hello World\n";

मेरे प्रश्न हैं:

  1. क्या एक निश्चित स्थिति में स्ट्रीम मैनिपुलेटर (एंडल) का उपयोग करना और एक अलग में एक भागने चरित्र के लिए अधिक उपयुक्त है?
  2. क्या दोनों में से किसी एक का उपयोग करने में कमियां हैं?
  3. क्या वे पूरी तरह से विनिमेय हैं?
  4. मैंने पढ़ा कि एक एस्केप सीक्वेंस को स्मृति में एकल वर्ण के रूप में संग्रहीत किया जाता है। क्या इसका मतलब यह है कि यदि आप कम मेमोरी खपत के लिए जा रहे हैं तो एंडल का उपयोग करना अधिक उचित है?
  5. क्या स्ट्रीम मैनिपुलेटर एंडल मेमोरी को किसी भी तरह से उपयोग करता है, यदि ऐसा है तो यह एस्केप सीक्वेंस से अधिक है?

धन्यवाद, StackExchange माफी यदि मैंने इसे गलत अनुभाग में पोस्ट किया है, तो मैंने सोचा कि इसे डेटा संरचनाओं के रूप में गिना जाता है।


2
एंडल भी कुछ धाराओं पर फ्लश का कारण बनता है, '\ n' नहीं।
जेम्स

जवाबों:


12

o << std::endl निम्नलिखित कोड के बराबर है:

o.put(o.widen('\n'));
o.flush();

दूसरे शब्दों में, आपको केवल std::endlतब उपयोग करना चाहिए जब आपको स्ट्रीम को फ्लश करने की आवश्यकता हो। उदाहरण के लिए:

  • आप एक समय लेने वाली परिचालन करने वाले हैं और ऐसा करने से पहले एक संदेश प्रदर्शित करना सुनिश्चित करना चाहते हैं।
  • एक और प्रक्रिया आपके आउटपुट पर प्रतीक्षा कर रही है।
  • यदि एक से अधिक थ्रेड या प्रक्रिया चल रही है, तो आपको आउटपुट फ्लश करने की आवश्यकता हो सकती है ताकि प्रत्येक थ्रेड या प्रक्रिया से आउटपुट सही ढंग से प्रदर्शित हो। (अन्यथा, आप थोड़े-थोड़े अंतराल पर आउटपुट के यादृच्छिक ब्लॉक प्राप्त कर सकते हैं।)

यदि आपको स्ट्रीम को फ्लश करने की आवश्यकता नहीं है , तो \nइसके बजाय का उपयोग करें std::endl। अतिरिक्त कॉल flushप्रदर्शन (कभी-कभी महत्वपूर्ण) को चोट पहुंचा सकते हैं।

अधिक जानकारी के लिए, cppreference.com देखें ।

मेमोरी के उपयोग के बारे में: \nबनाम के बारे में चिंता करना std::endlनिश्चित रूप से एक अनावश्यक सूक्ष्म अनुकूलन है, लेकिन सामान्य तौर पर, मैं \nकम मेमोरी लेने की उम्मीद करूंगा । \nएक स्ट्रिंग शाब्दिक के अंत में सिर्फ एक और बाइट है, जबकि लेखन std::endlको संकलक द्वारा अनुवाद किया जाता है (शायद इनबिल्ट) फ़ंक्शन कॉल putऔर flush

लाइन एंडिंग में प्लेटफ़ॉर्म-विशिष्ट अंतर (विंडोज \r\nबनाम लिनक्स और ओएस एक्स \n) की तुलना में निम्न स्तर पर नियंत्रित किया जाता है std::endlऔर \n:

  • यदि पाठ मोड में एक स्ट्रीम खोली जाती है, तो यदि आप लिखते हैं \n, तो यह स्वचालित रूप से इसे उपयुक्त प्लेटफ़ॉर्म-विशिष्ट लाइन अंत में अनुवाद करता है। यदि आप एक प्लेटफ़ॉर्म-विशिष्ट लाइन को समाप्त करते हुए पढ़ते हैं, तो स्ट्रीम स्वचालित रूप से इसका अनुवाद कर देती है \n
  • यदि बाइनरी मोड में एक स्ट्रीम खोली जाती है, तो वे वर्बेटिम के माध्यम से किसी भी लाइन के अंत को पास करते हैं, और यह आपके ऊपर है।
  • के लिए std::coutऔर std::cinविशेष रूप से, वे माने जाते हैं के रूप में यदि वे पाठ मोड।

1

1) पोर्टेबिलिटी के लिए, का उपयोग करें endl। विंडोज के न्यूलाइन्स हैं \r\n, लिनक्स \nऔर मैक \r संपादित करें: टिप्पणियों के अनुसार, लाइन सिस्टम विशिष्ट एंडिंग को निचले स्तर पर नियंत्रित किया जाता है।

2) endlप्रवाह को प्रवाहित "\n"करता है , नहीं करता है।

3) पोर्टेबिलिटी पर निर्भर करता है।

मेमोरी के उपयोग के रूप में, आप इसे अन्य स्टोरेज में फ्लश करके कम से कम कर सकते हैं endl। हालाँकि, यह प्रदर्शन को कम करेगा।

संपादित करें: कुछ गलतियों को साफ़ करें।


2
ओएस एक्स के बाद से मैक यूनिक्स पर आधारित है और इस प्रकार यह \nकिसी भी आधुनिक मशीन पर भी है।

7
क्षमा करें, लेकिन यह गलत है। endlऔर \nप्लेटफ़ॉर्म-विशिष्ट लाइन अंत के संबंध में समतुल्य हैं; प्लेटफ़ॉर्म अंतर को निम्न स्तर पर नियंत्रित किया जाता है।
जोश केली

2
आपकी पहली बात गलत है। एंडल () '\ n' को स्ट्रीम में भेजता है (फ्लश करने के अलावा)। '\ N' वर्ण को प्लेटफ़ॉर्म विशिष्ट End of line sequence(टेक्स्ट मोड मानकर) में बदल दिया जाता है । End of line sequence'\ N` जब एक फ़ाइल से पढ़ने का परिवर्तित वापस आ गया है। बिंदु 3) संदिग्ध है। और अंतिम पैराग्राफ फिर से गलत है: फ्लशिंग आपको स्थान नहीं बचाएगा और आवश्यकता से अधिक फ्लशिंग आपके कोड को धीमा कर देगा (बफर का बिंदु एक धीमी डिवाइस में लेखन दक्षता में सुधार करना है)।
मार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.