CreateFile
बनाम fopen
बनाम ofsteam
- लाभ & हानि?CreateFile बनाम fopen बनामस्टीम लाभ और नुकसान?
मैंने सुना है कि CreateFile शक्तिशाली लेकिन केवल विंडोज़ के लिए।
क्या आप बता सकते हैं कि मुझे (विंडोज़ पर) क्या उपयोग करना चाहिए और क्यों?
CreateFile
बनाम fopen
बनाम ofsteam
- लाभ & हानि?CreateFile बनाम fopen बनामस्टीम लाभ और नुकसान?
मैंने सुना है कि CreateFile शक्तिशाली लेकिन केवल विंडोज़ के लिए।
क्या आप बता सकते हैं कि मुझे (विंडोज़ पर) क्या उपयोग करना चाहिए और क्यों?
यह आपके द्वारा किए जा रहे कार्यों पर निर्भर करता है। अनुक्रमिक रूप से पाठ फ़ाइलों को पढ़ने और लिखने के लिए, Iostream निश्चित रूप से जाने का तरीका है। लेनदेन संबंधी सुरक्षा या गैर मानक उपकरणों से जुड़े किसी भी चीज़ के लिए, आपको सीधे सिस्टम (CreateFile
या open
) तक पहुंच प्राप्त करनी होगी। फिर भी, अनुक्रमिक पढ़ने और पाठ के लेखन के लिए, सबसे अच्छा समाधान अपने streambuf
को परिभाषित करना है, और iostream के साथ इसका उपयोग करना है।
मैं किसी भी संदर्भ के बारे में नहीं सोच सकता जहां fopen
बेहतर होगा।
ज्यादातर मामलों में आप सी ++ में सी या ऑफस्ट्रीम में फॉपेन का उपयोग करने के बेहतर होंगे। CreateFile साझा करने और कैशिंग पर कुछ अतिरिक्त नियंत्रण देता है लेकिन प्रारूपण कार्यक्षमता प्रदान नहीं करता है।
तो आप एक 'स्ट्रीमबफ' लिखते हैं जो 'CreateFile' का उपयोग करने के तरीके की तरह आपको उपयोग करता है, और दोनों के फायदे प्राप्त करता है। –
मैं हमेशा सोच रहा था, IOstreams में एक नए स्रोत या गंतव्य में प्लग करने के लिए इतना बोझिल क्यों है। यदि कुछ भी हो, तो सी ++ डेटा लेखक/पाठक के लिए एक शुद्ध अमूर्त वर्ग घोषित करना आसान बनाता है ... –
जब तक आप Windows फ़ाइल कार्यों के द्वारा उपलब्ध कराई गई सुविधाओं की जरूरत है (उदाहरण के लिए मैं ओवरलैप/ओ) तो मेरे सुझाव अधिक पोर्टेबल होने के अलावा सी में या तो iostreams ++ या FILE
(fopen
और दोस्तों) सी
में साथ जा रहा है , आप टेक्स्ट फ़ाइलों के लिए फॉर्मेटेड इनपुट/आउटपुट का भी उपयोग कर सकते हैं, और सी ++ के लिए अपने वर्गों के लिए आउटपुट/इनपुट ऑपरेटर को अधिभार करना आसान है।
'std :: streambuf' से प्राप्त करना और कुछ "विशेष" विशेषताओं (लेनदेन संबंधी अखंडता, विशेष डिवाइस) से प्राप्त करना भी आसान है। , आदि।)। –
जब तक आप absoulutely ओएस एपीआई कार्यों द्वारा प्रदान की अतिरिक्त कार्यक्षमता की जरूरत है (जैसे CreateFile
) मैं मानक पुस्तकालय कार्यों (जैसे fopen
या ofstream
) का उपयोग कर की सिफारिश चाहते हैं। इस तरह आपका कार्यक्रम अधिक पोर्टेबल होगा।
CreateFile
का उपयोग करने का केवल वास्तविक लाभ यह है कि मैं के ओवरलैप हो रही है मैं/हे और शायद बेहतर सुक्ष्म अधिकारों का उपयोग सोच सकते हैं।
आप Windows फ़ाइल स्मृति मानचित्रण का उपयोग करने के आप CreateFile
का उपयोग करना चाहिए (उदाहरण के लिए HANDLE
CreateFileMapping एपीआई के लिए पारित CreateFile
की वापसी मान है) चाहते हैं। इसके अलावा, CreateFile
सी और सी ++ मानक फ़ाइल एपीआई से उच्च अनुकूलन विकल्प प्रदान करता है।
हालांकि, अगर आप पोर्टेबल कोड लिखना चाहते हैं, या यदि आपको विंडोज-विशिष्ट विशेषताओं की आवश्यकता नहीं है, तो सी और सी ++ मानक फ़ाइल एपीआई ठीक हैं। कुछ परीक्षणों में, बड़े डेटा को संसाधित करते समय, मैंने सी ++ I/O धाराओं बनाम कच्चे सी फ़ाइल एपीआई के कुछ प्रदर्शन ओवरहेड को नोट किया; यदि आप इस तरह के मामलों में होते हैं, तो आप कुछ सी ++ आरएआईआई कक्षा में कच्चे सी फ़ाइल एपीआई को आसानी से लपेट सकते हैं, और फिर भी इसे सी ++ कोड में उपयोग कर सकते हैं।
मुझे 4 जीबी से 10 जीबी तक बड़ी डेटा फाइलों की आवश्यकता है और मेम मैपिंग मैं भी इसका उपयोग करूंगा। – Eveler
इसलिए यदि आपको मेमोरी मैपिंग की आवश्यकता है तो आप सीधे Win32 API कॉल का उपयोग कर सकते हैं और उन्हें C++ RAII कक्षाओं में लपेट सकते हैं। –
मैं
fopen or CreateFile in Windows
जो किसी कारण जो मुझे निकल जाता है के लिए बंद हो गया से मेरा उत्तर की नकल की ...
निष्कर्ष:
इन छोटे कार्यों के बारे में डरो मत। आपको वास्तव में पता चलेगा कि आपके कोड में क्या हो रहा है और कोड के इन छोटे टुकड़े कोड को कॉल करने की तुलना में नगण्य (कोड की रेखाओं की मात्रा में) होना चाहिए। इसके अलावा यदि आप सब कुछ के लिए आरएआईआई का उपयोग कर रहे हैं, तो इन यूटिलिटी क्लासेस में कॉल करने वाले कोड, आरएआईआई का उपयोग न करने की तुलना में काफी कम होंगे और दो या दो से अधिक चरण प्रारंभिक और काफी कम त्रुटि प्रवण का उपयोग करना होगा।अन्य ओएस के लिए समतुल्य उपयोगिता कक्षाओं के साथ इन उपयोगिता वर्गों को प्रतिस्थापित करना भी बाल खेल है (यूनिक्स पर खुला()/बंद()/पढ़ना()/लिखना() का उपयोग करना)।
और पिछले सहस्राब्दी के लिए Google प्रोग्रामिंग दिशानिर्देशों को नहीं पढ़ा है!
मुझे शक्ति चाहिए :) लिखना और बाइनरी पढ़ें। केवल विंडोज सिस्टम के लिए। जैसा कि मैंने खुला सुना और fopen createfile से मेल नहीं खाता? यह सच है? – Eveler
@Eveler: यदि आप पूर्ण शक्ति चाहते हैं, तो फ़ाइल को संसाधित करने के लिए आप सबसे तेज़ चीज इसे 'CreateFile' के साथ खोलना है और इसे 'CreateFileMapping'' के साथ मेमोरी में मैप करना है, जैसा कि [इस ब्लॉग पोस्ट] में दिखाया गया है (http: //blogs.msdn.com/b/oldnewthing/archive/2005/05/13/417183.aspx), जो ऑप्टिमाइज़ेशन श्रृंखला का हिस्सा है जो [मानक C++] से शुरू होता है (http://blogs.msdn.com/ बी/oldnewthing/संग्रह/2005/05/10/415991.aspx) और फिर प्रगतिशील रूप से [Win32 अनुकूलित कोड] पर चला जाता है (http://blogs.msdn.com/b/oldnewthing/archive/2005/05/19/420038 .aspx)। लेकिन ज्यादातर मामलों में सरल मानक सी और सी ++ ठीक हैं। –
'fopen' एक उच्च स्तरीय फ़ंक्शन है, जिसे C++ में' fstream :: open' द्वारा प्रतिस्थापित किया गया है। 'CreateFile' और' open' सिस्टम स्तर के फ़ंक्शन हैं, विंडोज़ में पहला, यूनिक्स में दूसरा। वे बिल्कुल वही चीज़ नहीं देते हैं, क्योंकि सिस्टम विभिन्न सुविधाओं का अलग-अलग समर्थन करते हैं। –