मैंने बस "एक फ़ाइल के अंत में एक नई लाइन चरित्र को हटाना" और सभी को अंतिम चरित्र को हटाने के लिए कहा। मेरा सवाल यह है कि क्या ईओएफ चरित्र अंतिम नहीं है?
मैंने बस "एक फ़ाइल के अंत में एक नई लाइन चरित्र को हटाना" और सभी को अंतिम चरित्र को हटाने के लिए कहा। मेरा सवाल यह है कि क्या ईओएफ चरित्र अंतिम नहीं है?
जवाबों:
एक फ़ाइल अंत के फ़ाइल वर्ण के साथ समाप्त नहीं होती है, क्योंकि पिछले उत्तर सही ढंग से बताता है। लेकिन मुझे लगता है कि उत्तर और टिप्पणियों में कुछ गलतियां हैं जो इंगित करने लायक हैं:
ASCII वर्ण सेट में सटीक EOF वर्ण नहीं है। कई "अंत" नियंत्रण वर्ण हैं: पाठ का अंत (3), ट्रांसमिशन का अंत (4), ट्रांसमिशन ब्लॉक का अंत (23), माध्यम का अंत (25)। फ़ाइल सेपरेटर (28) शायद एक ईओएफ चरित्र के सबसे करीब आता है। कोड 26 "सब्स्टिट्यूट" है, EOF नहीं।
Ctrl- Dकेवल टर्मिनल इनपुट के साथ जुड़ा हुआ है। उदाहरण के लिए कमांड
cat filea fileb filec > outfile
शामिल नहीं है Ctrl- D। वैसे, आप से कुछ और करने के लिए टर्मिनल EOF चरित्र को बदल सकते हैं Ctrl- Dका उपयोग करते हुए stty
आदेश।
सख्ती से बोलना, Ctrl- D(या जो भी आप बदल गए हैं) एक ईओएफ कुंजी कोड नहीं है। यह क्या करता है कि read
सिस्टम कॉल रिटर्न किस इनपुट के साथ उपलब्ध है, ठीक उसी तरह जैसे कि रिटर्न को दबाने से रीड सिस्टम कॉल रिटर्न कॉल करने वाले को वर्णों की एक पंक्ति देता है। रीड सिस्टम कॉल (यानी शून्य वर्ण रीड) से शून्य का रिटर्न वैल्यू कन्वेंशन करने से फाइल की स्थिति समाप्त हो जाती है। हालाँकि, इनपुट फ़ाइल स्वचालित रूप से बंद नहीं होती है, और, यदि इनपुट टर्मिनल से आता है, तो इसे "फ़ाइल के अंत" स्थिति में नहीं डाला जाता है। आप एक प्रोग्राम लिख सकते हैं जो "फ़ाइल के अंत" के बाद भी टर्मिनल से पढ़ना जारी रखता है और रीड कॉल अगली इनपुट लाइन के लिए गैर-शून्य वापस कर सकती है।
ईओएफ और ईओएल वर्णों के बीच समानता को देखा जा सकता है Ctrl- यदि Dकुछ इनपुट पहले से ही लाइन पर लिखे गए हैं, तो दबाया जाता है। उदाहरण के लिए, यदि आप "एबीसी" और प्रेस Ctrl- Dरीड कॉल रिटर्न लिखते हैं, तो इस बार 3 के रिटर्न मान के साथ और बफर में संग्रहीत "एबीसी" तर्क के रूप में पारित हो जाता है। क्योंकि पढ़ा 0 वापस नहीं करता है, यह ऊपर के सम्मेलन द्वारा ईओएफ स्थिति के रूप में व्याख्या नहीं किया गया है। इसी तरह, पूरे इनपुट लाइन (न्यूलाइन सहित) के साथ रीड कॉल रिटर्न बनाने के लिए रिटर्न दबाते हैं। आप इसे cat
कमांड के साथ आज़मा सकते हैं : लाइन पर कुछ अक्षर लिखें और दबाएँ Ctrl- D। आप उन पात्रों को देखेंगे जो आपके पास वापस लौट आए हैं और cat
अधिक इनपुट की प्रतीक्षा कर रहे हैं।
उपरोक्त सभी केवल तब लागू होता है जब टर्मिनल "पका हुआ" मोड में होता है, "कच्चा" मोड के विपरीत, जिसमें लाइन इनपुट प्रोसेसिंग को कम से कम किया जाता है। कच्चे मोड में वास्तव में एक Ctrl-D चरित्र इनपुट बफर को दिया जाता है।
ASCII नियंत्रण वर्णों की परिभाषा 1960 के दशक से है (वास्तव में इससे पहले कि आप किसी नेटवर्क पर विचार कर सकें )। उन सभी नियंत्रण वर्णों का उपयोग उस तरीके से नहीं किया जाता है, जैसा कि उन्हें तब दूरसंचार उपकरणों के लिए परिभाषित किया गया था।
यूनिक्स जैसी प्रणालियों पर, एक EOF
चरित्र की कोई आवश्यकता नहीं है ; कोई भी उपयोग नहीं किया जाता है। सिस्टम अनुप्रयोगों को बता सकता है कि एक फाइल में कितने बाइट हैं:
कुछ अन्य प्रणालियों (वीएमएस, डॉस, विंडोज में देखा गया) पर, एक नियंत्रण-जेड फ़ाइल मार्कर के रूप में कार्य कर सकता है क्योंकि पुराने संस्करणों में सिस्टम कुछ अनुप्रयोगों को यह नहीं बता सकता है कि फ़ाइल में कितने बाइट हैं।
वीएमएस के मामले में, सी रनटाइम काम करने के तरीके के कारण सीमा थी। असेंबली-भाषा एप्लिकेशन सही फ़ाइल आकार प्राप्त कर सकते हैं (और किया था)।
शेल में यूनिक्स सिस्टम पारंपरिक रूप से नियंत्रण-डी का उपयोग एक अनुप्रयोग को बताने के लिए करता है कि इनपुट (फ़ाइल) का एक अंत हो गया है, लेकिन नियंत्रण-डी फ़ाइल में संग्रहीत नहीं है।
सी में, EOF
जानबूझकर -1
यह इंगित करने के लिए बनाया गया है कि यह एक वैध चरित्र नहीं है। स्टैंडर्ड I / O रिटर्न EOF
तब मिलता है जब एक एंड-ऑफ-द-फ़ाइल स्थिति का पता लगाया जाता है - विशेष चरित्र नहीं।
वैसे, फ़ाइलों को एक नई पंक्ति (ASCII लाइन-फीड) चरित्र के साथ समाप्त होने की आवश्यकता नहीं है । पाठ संपादक उन फ़ाइलों के साथ सामना कर सकते हैं जो सभी मुद्रण योग्य पाठ हैं, लेकिन एक अनुगामी न्यूलाइन की कमी है।
busybox
's vi
, आदि)।
EOF एक चरित्र नहीं है। यह एक ऐसी स्थिति है जो फ़ाइल स्ट्रीम से पढ़ने के लिए कोई और वर्ण इंगित नहीं करता है। जब आप टर्मिनल से ईओएफ कमांड दर्ज करते हैं, तो आप इनपुट स्ट्रीम को बंद करने के लिए ओएस को संकेत दे रहे हैं, विशेष चरित्र में नहीं डाल रहे हैं।
bash
इनपुट पर अपना हाथ आने से पहले , यह TTY ड्राइवर द्वारा मालिश किया जाता है। यह ड्राइवर Ctrl-D को स्वीकार करता है और एक EOF को भेजता है bash
(जहां EOF एक चरित्र नहीं है, लेकिन एक विशेष फ़ाइल स्थिति है)