2015-06-12 5 views
5

यह प्रश्न फ़ाइलों को डेटा पढ़ने और लिखते समय ifstream और ऑफस्ट्रीम के व्यवहार से संबंधित है।सी ++ ifstream, ऑफ़स्ट्रीम: कच्चे पढ़ने()/लिखने() कॉल और बाइनरी मोड में फ़ाइल खोलने के बीच क्या अंतर है?

आसपास stackoverflow.com मुझे पता है कि operator<< (धारा प्रविष्टि ऑपरेटर) वस्तुओं धर्मान्तरित जैसे उत्पादन से पहले पाठ में प्रतिनिधित्व दोगुना हो जाता है, और read() करने के लिए कॉल और write() पढ़ने और कच्चे डेटा लिखने के रूप में यह में संग्रहित है में कामयाब रहे पढ़ने से क्रमशः स्मृति (बाइनरी प्रारूप)। संपादित करें: यह बहुत स्पष्ट है, यहां कुछ भी अप्रत्याशित नहीं है।

मुझे यह भी पता चला कि द्विआधारी मोड में एक फ़ाइल खोलने से विभिन्न ऑपरेटिंग सिस्टमों द्वारा आवश्यक न्यूलाइन अक्षरों के स्वचालित अनुवाद को रोक दिया जाता है।

तो मेरा सवाल यह है: क्या यह स्वचालित अनुवाद है, उदाहरण के लिए; \n से \r\n पर फ़ंक्शन कॉल करते समय read() और write()? या यह व्यवहार operator<< के लिए विशिष्ट है। (और operator>>।)

ध्यान दें कि यहां एक समान लेकिन थोड़ा कम विशिष्ट प्रश्न है। यह एक निश्चित जवाब नहीं देता है। Difference in using read/write when stream is opened with/without ios::binary mode

+1

[बाइनरी और टेक्स्ट मोड] (http://en.cppreference.com/w/cpp/io/c#Binary_and_text_modes) –

+2

@ πάνταῥεῖ यह प्रश्न का उत्तर नहीं देता है। ऐसा लगता है कि ओपी बाइनरी और टेक्स्ट मोड के बीच अंतर को समझ गया। समस्या यह है कि सी ++ की धारा में स्वरूपित और अनफॉर्मेटेड I/O की अतिरिक्त अवधारणा है। जैसा कि मैंने इसे समझा, यह सवाल यह है कि वे दोनों कैसे बातचीत करते हैं। – ComicSansMS

+0

तो क्या यह व्यवहार पढ़ने()/लिखने() या नहीं पढ़ने के लिए भी लागू होता है? – user3728501

उत्तर

4

बाइनरी और टेक्स्ट मोड के बीच का अंतर निम्न स्तर पर है।

यदि आप टेक्स्ट मोड में कोई फ़ाइल खोलते हैं तो आपको read और write संचालन का उपयोग करते समय भी अनुवादित डेटा प्राप्त होगा।

कृपया यह भी ध्यान दें कि यदि आपको पिछले tell (या 0) से स्थिति प्राप्त की गई थी तो आपको केवल टेक्स्ट फ़ाइल में seek की अनुमति है। यादृच्छिक स्थिति करने में सक्षम होने के लिए, फ़ाइल बाइनरी मोड में खोली जानी चाहिए।

-2

संक्षिप्त उत्तर - पढ़ने का उपयोग करते समय कोई अनुवाद नहीं किया गया() लिखें()। [आपके प्रश्न का उत्तर "नहीं।"]

लंबा उत्तर - पढ़ें() & लिखना() बाइनरी मोड में संचालित होता है जिसका अर्थ है कि सामग्री को "बाइनरी डेटा" माना जाता है। एक \ n एक ASCII 10 और 10 एक वैध डेटा मान है जो, उदाहरण के लिए, संख्या 10 का प्रतिनिधित्व कर सकता है।

\ n \ r \ n को बदलने का यह व्यवसाय एक Windows मुद्दा है। लिनक्स में, लाइन के अंत को बस \ n के साथ चिह्नित किया जाता है और कोई अनुवाद की आवश्यकता नहीं होती है।

आप http://linux.die.net/man/3/fopen पर fopen के लिए मैनुअल पेज को देखें, तो वहाँ इस पैरा

The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-UNIX environments.) 

उम्मीद है कि मदद मिलेगी है।

+0

डाउनवोट के लिए खेद है लेकिन यह वास्तव में गलत है। एक, 'istream :: read()' और 'ostream :: लिखना()' नहीं * * बाइनरी मोड में गारंटी ऑपरेशन (क्योंकि टेक्स्ट और बाइनरी मोड के बीच अंतर ओएस स्तर पर होता है, मानक लाइब्रेरी स्तर नहीं)। लाइन मोड के साथ परेशान किए बिना * टेक्स्ट * बफर लिखने के रूप में टेक्स्ट मोड स्ट्रीम पर 'लिखें()' के बारे में सोचें। अन्य सभी दांव बंद हैं। इसके अलावा, पॉज़िक्स को उद्धृत करना (जो * होता है * टेक्स्ट मोड को बाइनरी मोड के समान ही संभालता है) इसका मतलब यह नहीं है कि धारणा कम चेहरे प्लेटफ़ॉर्म पर आपके चेहरे पर उड़ा नहीं जाएगी। – DevSolar

+0

@ डेवसोलर, मैंने आईट्रीम नहीं कहा :: पढ़ा() और ओस्ट्रीम :: लिखें()। लेखक का अर्थ है आईट्रीम :: read() और ostream :: लिखना() लेकिन जो मैंने पढ़ा था उसे पढ़ा गया था() और लिखना() और मैंने पढ़ने() और लिखने के लिए एक जवाब दिया()। मैंने इस सवाल को गलत समझा होगा (जो अब संभवतः लगता है) लेकिन यह मेरे जवाब को वास्तव में गलत कैसे बनाता है? (यह गलत संदर्भ देता है लेकिन यह गलत कैसे है? सिस्टम कॉल के बारे में सोचें() और लिखें()।) –

+0

@DevSolar, यदि आप सही हैं, तो ऐसा लगता है कि ये दस्तावेज़ गलत हैं। [लिंक] (http://www.cplusplus.com/reference/ostream/ostream/write/?kw=write) और [लिंक] (http://www.cplusplus.com/reference/ostream/ostream/write/ ? kw = लिखें) जिसमें वे कहते हैं "बस डेटा के ब्लॉक की प्रतिलिपि बनाते हैं ..." अब, शायद वे गलत हैं या शायद मैं "बस प्रतियां ..." वाक्यांश को समझ नहीं पा रहा हूं क्योंकि \ n \ r \ n एक अनुवाद है (एक "बस प्रतियां" नहीं)। –

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