क्या आप फ़ाइल को BINARY या TEXT मोड में पढ़ रहे हैं ? में पाठ मोड जोड़ी गाड़ी वापसी / लाइन फ़ीड, CRLF , के रूप में व्याख्या की है पाठ पंक्ति के अंत, या लाइन चरित्र के अंत है, लेकिन में बायनरी आप केवल लाने एक एक समय में बाइट, जिसका अर्थ है कि या तो चरित्र MUSTनजरअंदाज किया और बफर में एक और बाइट के रूप में लाने के लिए छोड़ दिया! कैरिज रिटर्न का मतलब है, टाइपराइटर में, कि टाइपराइटर कार, जहां प्रिंटिंग आर्म निहित है, कागज के दाहिने किनारे पर पहुंच गया है और बाएं किनारे पर वापस आ गया है। यह एक बहुत ही यांत्रिक मॉडल है, जो यांत्रिक टाइपराइटर का है। फिर लाइन फीड का मतलब है कि पेपर रोल को थोड़ा ऊपर घुमाया जाता है, ताकि कागज टाइपिंग की दूसरी लाइन शुरू करने की स्थिति में हो। जैसा कि मुझे याद है कि ASCII में कम अंकों में से एक का अर्थ है कि टाइपिंग के बिना सही एक वर्ण पर जाएं, मृत वर्ण, और निश्चित रूप से बैकस्पेस का अर्थ है: कार को एक वर्ण वापस ले जाएं। इस तरह से आप विशेष प्रभाव जोड़ सकते हैं, जैसे अंतर्निहित (प्रकार अंडरस्कोर), स्ट्राइकथ्रू (टाइप माइनस), लगभग अलग-अलग उच्चारण, रद्द करें (टाइप एक्स), एक विस्तारित कीबोर्ड की आवश्यकता के बिना, लाइन फीड में प्रवेश करने से पहले लाइन के साथ कार की स्थिति को समायोजित करके। तो आप बीच में एक कंप्यूटर के बिना टाइपराइटर को स्वचालित रूप से नियंत्रित करने के लिए बाइट आकार के ASCII वोल्टेज का उपयोग कर सकते हैं। जब स्वचालित टाइपराइटर पेश किया जाता है,AUTOMATIC का अर्थ है कि एक बार जब आप कागज के सबसे दूर के किनारे पर पहुँच जाते हैं, तो कार बाईं ओर वापस आ जाती है और लाइन फीड लागू हो जाता है, यानी रोल के ऊपर जाते ही कार अपने आप वापस आ जाती है! तो आपको दोनों नियंत्रण वर्णों की आवश्यकता नहीं है, केवल एक, \ n, नई पंक्ति, या पंक्ति फ़ीड।
इसका प्रोग्रामिंग से कोई लेना-देना नहीं है लेकिन ASCII अधिक पुराना है और HEY है! ऐसा लगता है कि कुछ लोग सोच नहीं रहे थे जब उन्होंने पाठ करना शुरू किया था! UNIX प्लेटफॉर्म एक इलेक्ट्रिकल ऑटोमैटिक टाइपकेमाइन मानता है; विंडोज मॉडल अधिक पूर्ण है और यांत्रिक मशीनों के नियंत्रण की अनुमति देता है, हालांकि कुछ नियंत्रण वर्ण कंप्यूटर में कम और कम उपयोगी हो जाते हैं, जैसे घंटी चरित्र, 0x07 अगर मुझे अच्छी तरह से याद है ... कुछ भूल गए ग्रंथों को मूल रूप से नियंत्रण वर्णों के साथ कैप्चर किया जाना चाहिए। विद्युत नियंत्रित टाइपराइटर के लिए और यह मॉडल को बनाए रखा ...
वास्तव में सही भिन्नता सिर्फ \ r, लाइन फीड, कैरिज रिटर्न के अनावश्यक होने, यानी स्वचालित, इसलिए शामिल होगी:
char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...
सभी प्रकार की फ़ाइलों को संभालने का सबसे सही तरीका होगा। नोट तथापि कि \ N में पाठ मोड वास्तव में बाइट जोड़ी 0x0d 0x0A है, लेकिन 0x0d है सिर्फ \ r: \ n \ r शामिल पाठ मोड लेकिन नहीं में बायनरी है, तो \ N और \ r \ n बराबर हैं ... या होना चाहिए। यह वास्तव में एक बहुत ही बुनियादी उद्योग भ्रम है, ठेठ उद्योग जड़ता, जैसा कि सम्मेलन सभी प्लेटफार्मों में CRLF की बात करना है, फिर विभिन्न द्विआधारी व्याख्याओं में आते हैं। सख्ती से, केवल 0x0d (गाड़ी वापसी) सहित फाइलें \ n (CRLF या लाइन फीड) होने के कारण, पाठ में विकृत हैंमोड (टाइपराइटर मशीन: बस कार और स्ट्राइकथ्रू सबकुछ वापस करें ...), और एक नॉन-लाइन ओरिएंटेड बाइनरी फॉर्मेट (या तो \ r या \ r \ n अर्थ लाइन ओरिएंटेड) हैं, ताकि आप टेक्स्ट के रूप में पढ़ने वाले न हों! कोड को कुछ उपयोगकर्ता संदेश के साथ विफल होना चाहिए। यह केवल ओएस पर निर्भर नहीं करता है, बल्कि सी लाइब्रेरी कार्यान्वयन पर भी भ्रम और संभावित बदलावों को जोड़ रहा है ... (विशेष रूप से पारदर्शी यूनिकोड अनुवाद परतों के लिए भ्रामक विविधताओं के लिए अभिव्यक्ति का एक और बिंदु जोड़ रहा है)।
पिछले कोड स्निपेट (मैकेनिकल टाइपराइटर) के साथ समस्या यह है कि यह बहुत ही अक्षम है अगर \ r (ऑटोमैटिक टाइपराइटर टेक्स्ट) के बाद कोई \ n वर्ण नहीं हैं। फिर यह BINARY मोड को भी मानता है जहां C लाइब्रेरी टेक्स्ट व्याख्याओं (लोकेल) को अनदेखा करने के लिए मजबूर है और सरासर बाइट्स को दूर करती है। दोनों मोड के बीच वास्तविक पाठ वर्णों में कोई अंतर नहीं होना चाहिए, केवल नियंत्रण वर्णों में, इसलिए सामान्यतया BINARY पढ़ना बोलना पाठ मोड से बेहतर है। यह समाधान BINARY के लिए कुशल हैसी लाइब्रेरी विविधताओं से स्वतंत्र रूप से विन्डोज़ ओएस फाइल पाठ मोड्स, और अन्य प्लेटफ़ॉर्म टेक्स्ट फॉर्मेट (पाठ में वेब अनुवाद सहित) के लिए अक्षम। यदि आप दक्षता के बारे में परवाह करते हैं, तो जाने का तरीका एक फ़ंक्शन पॉइंटर का उपयोग करना है, फिर भी जिस तरह से आप चाहते हैं, उसके लिए \ r vs \ r \ n लाइन नियंत्रण का परीक्षण करें, फिर पॉइंटर में सर्वश्रेष्ठ गेटलाइन उपयोगकर्ता-कोड का चयन करें और इसे से आमंत्रित करें यह।
संयोग से मुझे याद है कि मुझे कुछ \ r \ n टेक्स्ट फाइलें भी मिलीं ... जो कि अभी भी कुछ मुद्रित टेक्स्ट उपभोक्ताओं द्वारा आवश्यक डबल लाइन टेक्स्ट में तब्दील होती हैं।