किसी फ़ाइल में अंतिम वर्ण क्या है?


19

मैंने बस "एक फ़ाइल के अंत में एक नई लाइन चरित्र को हटाना" और सभी को अंतिम चरित्र को हटाने के लिए कहा। मेरा सवाल यह है कि क्या ईओएफ चरित्र अंतिम नहीं है?



1
@SorenBjornstad मैं यह भी जोड़ना चाहूंगा कि जब एक यूनिक्स टेक्स्ट फाइल के अंत में कोई नई रेखा होती है, तो वह वहां होती है क्योंकि वह अंतिम पंक्ति को समाप्त कर देती है। एक खाली पाठ फ़ाइल के अंत में कोई नई पंक्ति नहीं है: यह शून्य वर्णों का एक क्रम है।
काज

3
थोड़ा पांडित्यपूर्ण होने के लिए, CPM और DOS ने ^ Z को EOF वर्ण के रूप में उपयोग किया, और आप अभी भी कभी-कभी उन फ़ाइलों का सामना कर सकते हैं जो ^ Z से समाप्त होती हैं।
एडवर्ड फॉक

जवाबों:


13

एक फ़ाइल अंत के फ़ाइल वर्ण के साथ समाप्त नहीं होती है, क्योंकि पिछले उत्तर सही ढंग से बताता है। लेकिन मुझे लगता है कि उत्तर और टिप्पणियों में कुछ गलतियां हैं जो इंगित करने लायक हैं:

  • 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 चरित्र इनपुट बफर को दिया जाता है।


19

ASCII नियंत्रण वर्णों की परिभाषा 1960 के दशक से है (वास्तव में इससे पहले कि आप किसी नेटवर्क पर विचार कर सकें )। उन सभी नियंत्रण वर्णों का उपयोग उस तरीके से नहीं किया जाता है, जैसा कि उन्हें तब दूरसंचार उपकरणों के लिए परिभाषित किया गया था।

यूनिक्स जैसी प्रणालियों पर, एक EOFचरित्र की कोई आवश्यकता नहीं है ; कोई भी उपयोग नहीं किया जाता है। सिस्टम अनुप्रयोगों को बता सकता है कि एक फाइल में कितने बाइट हैं:

  • कुछ अन्य प्रणालियों (वीएमएस, डॉस, विंडोज में देखा गया) पर, एक नियंत्रण-जेड फ़ाइल मार्कर के रूप में कार्य कर सकता है क्योंकि पुराने संस्करणों में सिस्टम कुछ अनुप्रयोगों को यह नहीं बता सकता है कि फ़ाइल में कितने बाइट हैं।

    वीएमएस के मामले में, सी रनटाइम काम करने के तरीके के कारण सीमा थी। असेंबली-भाषा एप्लिकेशन सही फ़ाइल आकार प्राप्त कर सकते हैं (और किया था)।

  • शेल में यूनिक्स सिस्टम पारंपरिक रूप से नियंत्रण-डी का उपयोग एक अनुप्रयोग को बताने के लिए करता है कि इनपुट (फ़ाइल) का एक अंत हो गया है, लेकिन नियंत्रण-डी फ़ाइल में संग्रहीत नहीं है।

सी में, EOFजानबूझकर -1यह इंगित करने के लिए बनाया गया है कि यह एक वैध चरित्र नहीं है। स्टैंडर्ड I / O रिटर्न EOFतब मिलता है जब एक एंड-ऑफ-द-फ़ाइल स्थिति का पता लगाया जाता है - विशेष चरित्र नहीं।

वैसे, फ़ाइलों को एक नई पंक्ति (ASCII लाइन-फीड) चरित्र के साथ समाप्त होने की आवश्यकता नहीं है । पाठ संपादक उन फ़ाइलों के साथ सामना कर सकते हैं जो सभी मुद्रण योग्य पाठ हैं, लेकिन एक अनुगामी न्यूलाइन की कमी है।


8
POSIX लाइनों के अनुक्रम वाली फ़ाइल के रूप में एक पाठ फ़ाइल को परिभाषित करता है और प्रत्येक पंक्ति को गैर-न्यूलाइन वर्णों के अनुक्रम के रूप में बदल देता है, जिसके बाद एक नई रेखा होती है। इस प्रकार किसी भी चीज़ के साथ समाप्त होने वाली फ़ाइल लेकिन 0x0A एक अनुरूपण पाठ फ़ाइल नहीं है।
डैमियन येरिक 22

2
मुझे इसकी जानकारी है, यही वजह है कि मैंने उस पाठ संपादकों को काम करने के लिए कहा। (बाइनरी फ़ाइलों में ऐसी कोई बाधा नहीं है)।
थॉमस डिक्की

यह वास्तव में ध्यान देने योग्य है कि जिन पाठों को पाठ के रूप में संभाला जाना चाहिए, जिनके पास अनुगामी नई रेखा नहीं है, फिर भी यकीनन खराब रूप हैं (भले ही विशिष्ट पाठ संपादकों को ऐसी फ़ाइलों की भरपाई करने के लिए कोडित किया गया हो), कम से कम यदि आप वास्तव में चाहते हैं तो मोटे तौर पर उपयोगकर्ता के अनुकूल / संगत, क्योंकि एक अनुगामी न्यूलाइन की कमी विभिन्न परिस्थितियों में अतिरिक्त कठिनाइयाँ जोड़ सकती है (एकाधिक पाठ फ़ाइलों को मुद्रित / प्रिंट करना, विशिष्ट कमांड-लाइन टूल के साथ पार्स करना, न्यूनतम संपादकों जैसे busybox's vi, आदि)।
22

(1) VMS से पहले, RT-11 RSX-11 TOPS-10 में फाइलसिस्टम केवल एक ब्लॉक के लिए सटीक था और इसे EOF चरित्र की आवश्यकता थी। तो सीपी / एम किया, जिसने स्पष्ट रूप से इसे डीईसी से कॉपी किया और बदले में प्रारंभिक एमएस-डॉस द्वारा कॉपी किया गया और फिर विंडोज के लिए नीचे पारित किया गया। (2) यूनिक्स में, यह ट्टी ड्राइवर नहीं है, जैसा कि जोहानम द्वारा और अधिक विस्तार से वर्णन किया गया है, हालांकि लोग आमतौर पर टटी उपकरणों पर गोले चलाते हैं।
dave_thompson_085 12

ज़रूर - DEC वहाँ वापस आ गया (और ध्यान दें कि मैंने पुराने संस्करणों का उल्लेख किया है )। क्या यह सीपी / एम फीचर की उत्पत्ति थी, यह पता लगाने के लिए एक दिलचस्प विषय होगा (यहां नहीं); मैंने उन मामलों का उल्लेख किया जो विकल्प के लिए कुछ पृष्ठभूमि देते हैं।
थॉमस डिकी

7

EOF एक चरित्र नहीं है। यह एक ऐसी स्थिति है जो फ़ाइल स्ट्रीम से पढ़ने के लिए कोई और वर्ण इंगित नहीं करता है। जब आप टर्मिनल से ईओएफ कमांड दर्ज करते हैं, तो आप इनपुट स्ट्रीम को बंद करने के लिए ओएस को संकेत दे रहे हैं, विशेष चरित्र में नहीं डाल रहे हैं।


1
हां, लेकिन एएससीआईआई तालिका में ईओएफ 26 है, इसलिए मुझे लगा कि अंतिम बाइट 26 का द्विआधारी प्रतिनिधित्व था। इसलिए एक प्रोग्राम जो एक इनपुट पढ़ता है वह कैसे समाप्त हो सकता है?
स्वोरविट्ज़

ASCII एक नेटवर्क पर सूचना पारित करने के लिए था। उस स्थिति में, आपको ईओएफ चरित्र की आवश्यकता होती है। (ASCII में बहुत सारे नियंत्रण कोड भी थे। सब कुछ प्रिंट करने योग्य नहीं था।) फ़ाइल धाराओं के मामले में, फ़ाइल का आकार पहले से ही फाइल सिस्टम के माध्यम से जाना जाता है, इसलिए ओएस बता सकता है कि कब पढ़ने के लिए अधिक डेटा नहीं है।
मुनीर

@sworwitz: C के संबंध में, इनपुट रीडिंग फ़ंक्शंस जो एक वर्ण प्रति कॉल लौटाते हैं एक इंट (आमतौर पर एक 32 बिट संख्या लेकिन न्यूनतम 16 बिट्स होना चाहिए) एक चार नहीं। फ़ंक्शन सिग्नल और ईओएफ -1 (0xffffffff) जो कि वैध 8 बिट मूल्य नहीं है, इसलिए यह किसी भी ASCII वर्ण द्वारा भ्रमित नहीं होगा, यहां तक ​​कि 0xff भी नहीं। स्ट्रिंग वापस करने वाले फ़ंक्शंस भी रीड डेटा की लंबाई लौटाते हैं। इस लंबाई का उपयोग किसी डेटा या डेटा के अंत को इंगित करने के लिए किया जा सकता है (फिर से, लंबाई -1 हो सकती है)। अंत में, एक फ़ंक्शन भी है जिसे आप कॉल कर सकते हैं जो आपको बताएगा कि क्या एक धारा अंत तक पहुंच गई है
स्लीवेटमैन

ठीक है धन्यवाद! तो जब मैं bash में Ctrl + d दबाता हूँ तो मैं ASCII वर्ण इनपुट देता हूँ, है ना?
swwwitz

@sworwitz बिल्कुल नहीं। bashइनपुट पर अपना हाथ आने से पहले , यह TTY ड्राइवर द्वारा मालिश किया जाता है। यह ड्राइवर Ctrl-D को स्वीकार करता है और एक EOF को भेजता है bash (जहां EOF एक चरित्र नहीं है, लेकिन एक विशेष फ़ाइल स्थिति है)
Stig Hemmer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.