2010-01-21 9 views
8

मुझे लगता है कि रीडफाइल, लिखेंफाइल, आदि या यहां तक ​​कि fprintf जैसे विंडोज फ़ंक्शंस के बजाय सी ++ में स्ट्रीम का उपयोग करना बेहद आसान है। धाराओं का उपयोग करना अच्छा नहीं है? धाराओं का उपयोग करना कब अच्छा है? क्या धाराओं का उपयोग करना सुरक्षित है? कितने प्रोग्रामर धाराओं का उपयोग नहीं करते हैं?ReadFile, WriteFile, fprintf, आदि पर C++ iostreams का उपयोग करना कब अच्छा है?

यह केवल कुछ है जो मैंने हमेशा सोचा है और शायद आप कुछ ज्ञान छोड़ सकते हैं।

+2

बूस्ट :: प्रारूप लाइब्रेरी एक और विकल्प है जो टाइप-सुरक्षित प्रिंटफ-जैसी स्वरूपण प्रदान करता है: http://www.boost.org/doc/libs/1_41_0/libs/format/doc/format.html – Void

+0

बार-बार उपयोग 'boost :: format' का आपके प्रदर्शन को बुरी तरह नुकसान पहुंचा सकता है। बूस्ट 1.33 का उपयोग कर एक प्रोजेक्ट में, मुझे प्रदर्शन समस्याओं (प्रोफाइलर के साथ मापा गया) के कारण boost :: प्रारूप का उपयोग करना बंद करना पड़ा। –

+0

धन्यवाद, यह जानना अच्छा है। मैंने वास्तव में कभी भी बढ़ावा देने की कोशिश नहीं की है, लेकिन यह देखकर कि यह बहुत लोकप्रिय है, मुझे शायद इसे कभी-कभी जांचना चाहिए। –

उत्तर

10

धाराओं का उपयोग करना अच्छा नहीं है?

  • स्ट्रीम सुरक्षित थ्रेड होने की गारंटी नहीं कर रहे हैं। ऐसी स्थिति का सपना देखना आसान है जहां आप कुछ सिंक्रनाइज़ेशन के बिना धाराओं का उपयोग नहीं कर सकते।
  • स्ट्रीम ऑब्जेक्ट्स आमतौर पर सुंदर "भारी" होते हैं। वे कम स्मृति या एम्बेडेड वातावरण के लिए बहुत भारी हो सकते हैं।

धाराओं का उपयोग करना कब अच्छा है?

सामान्य रूप से।

क्या यह धाराओं का उपयोग सुरक्षित है?

हां, लेकिन स्ट्रीम को असीमित रूप से साझा करते समय आपको सावधान रहना होगा।

कितने प्रोग्रामर स्ट्रीम का उपयोग नहीं करते हैं?

प्राथमिकता, शैली, या उन्होंने पहले एक अलग विधि (या अलग भाषा) सीखी। मुझे लगता है कि पुराने "सी ++" उदाहरण ऑनलाइन बहुत सी सी-स्वाद के साथ लिखे गए हैं, जो सीओटी को मुद्रित करना पसंद करते हैं।

+0

सबसे पूरा उत्तर और यह सुरक्षा के बारे में सामान का उल्लेख करता है। –

3
  1. जब आप अपने ऐप को विभिन्न प्लेटफ़ॉर्म पर पोर्टेबल होना चाहते हैं।

  2. जब आप अधिक संक्षिप्त कोड चाहते हैं: Win32 फ़ंक्शंस में अधिक विस्तृत अर्थशास्त्र होते हैं, अक्सर कुछ करने के लिए कार्यों के संग्रह की आवश्यकता होती है, और निश्चित रूप से अधिक पैरामीटर होते हैं।

11

स्ट्रीम आमतौर पर काफी सुरक्षित होते हैं। कुछ परिस्थितियों में, वे धीमे और/या बेकार हो सकते हैं। धीरे-धीरे, ज्यादातर इस तथ्य से उपजी हैं कि वे आपके कोड और ओएस के बीच कुछ अतिरिक्त परत लगाते हैं, और गलत परिस्थिति में उन परतें ओवरहेड जोड़ सकती हैं। झुकाव ज्यादातर सी के प्रिंटफ की तुलना में है, लिखितफाइल जैसे कुछ प्रत्यक्ष उपयोग नहीं (जो सीधे प्रारूपण का समर्थन नहीं करता है)। उदाहरण के लिए, तथापि, पर विचार करें:

printf("%2.2x", ch);` 

std::cout << std::hex << std::setw(2) << std::setprecision(2) << std::setfill('0') << ch; 
std::cout << setfill(' '); 

को फिर तथ्य यह है कि अगर आप i18n के बारे में परवाह, printf एक स्ट्रिंग आसान है कि उपयोग कर रहा है एक बाहरी स्रोत है, जहां से पढ़ने के लिए पर विचार सी ++ स्ट्रीम सभी स्वरूपण को कोड की संरचना में एम्बेड कर रहा है, इसलिए फ़ॉर्मेटिंग में लगभग किसी भी बदलाव के लिए कोड को दोबारा लिखना, पुन: सम्मिलित करना और रिलिकिंक करना आवश्यक है।

CreateFile, ReadFile, आदि, मेमोरी मैप की गई फ़ाइलों जैसी कई चीजों को भी अनुमति देता है और पढ़ने और लिखने को ओवरलैप करता है जो Iostreams द्वारा समर्थित नहीं हैं। यदि स्थिति आपको इनका अच्छा उपयोग करने देती है, तो iostreams अक्सर प्रतिस्पर्धी नहीं होंगे।

+2

आमतौर पर इसके साथ काम नहीं करने वाले लोगों के लाभ के लिए, इस पोस्ट से "i18n" का अर्थ है "अंतर्राष्ट्रीयकरण"। उस शब्द में 'i' और 'n' के बीच 18 वर्ण हैं, इसलिए "i18n"। –

+0

@ केविन: ओह, बिल्कुल सही। अनुवाद के लिए धन्यवाद। –

+0

* printf अभी भी i18n के लिए उपयोग नहीं किया जा सकता है क्योंकि चर की स्थिति और प्रकार हार्ड-कोडेड है। – rpg

1

प्रिंटफ() को पसंद करने के कारणों में से एक यह है कि स्वरूप तार स्वयं संसाधन हो सकते हैं, इस प्रकार पुन: संकलन को मजबूर किए बिना प्रोग्राम आउटपुट पर अधिक बाहरी नियंत्रण की अनुमति मिलती है।

मुझे कारणों में से एक कारण है() यह कच्ची गति है।

मेरे अनुभव में, यह एक काफी धार्मिक मुद्दा है।

4

आप अतुल्यकालिक फ़ाइल नहीं कर सकते मैं/हे धाराओं के साथ ...

1

एक कारण है i18n

string time = "4:32"; 
cout << "the current time is " << time; 
cout << "वर्तमान समय " << time << " है।" 
cout << time << "في الوقت الحالي هو"; 

बनाम

string format = "the current time is %s"; 
string format = "वर्तमान समय %s है।"; 
string format = "%s في الوقت الحالي هو"; 
printf(format, time); 
1

तीन विकल्प आप उल्लेख किया है रहे हैं यहां:

  1. सी ++ स्ट्र eams (ostream, IStream, fstream)
  2. सी stdio (printf, sprintf fprintf)
  3. Windows फ़ाइलों (ReadFile, WriteFile)

विकल्प 1 & 2 मंच स्वतंत्र हैं। इसका मतलब है कि आप मैक, लिनक्स, या कई अन्य ऑपरेटिंग सिस्टम के लिए कोड संकलित कर सकते हैं। विकल्प 3 केवल विंडोज है। इसका मतलब है कि आप इसे विंडोज़ के अलावा कुछ भी संकलित नहीं कर सकते हैं।

विकल्प 1 & 2 के बीच निर्णय लेने पर, यह इस बात पर निर्भर करता है कि आप इसका उपयोग कैसे करना चाहते हैं। सी पुस्तकालय भाषाओं के बारे में उपयोग करना आसान है। यह धाराओं में वैकल्पिक भाषाओं के साथ पाठ को प्रतिस्थापित करने का प्रयास करने वाला एक दुःस्वप्न है, हालांकि धाराओं को थ्रेड-सुरक्षित बनाने के लिए बहुत आसान है, अधिक जटिल वर्गों को एक प्रिंट करने योग्य प्रारूप में अनुवादित करें, और स्ट्रीम क्षमताओं का विस्तार करें।

सी ++ की आईस्ट्रीम बनाम सी के स्टडीओ एक अत्यधिक गरम तर्क है जिस पर इस मंच में C++ Streams vs. C-style IO? और अन्य स्थानों पर कई अन्य स्थानों पर चर्चा की गई है।

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