2010-06-17 6 views
34

सी जैसी भाषाओं की ++ जब एक फ़ाइल में लेखन, एक EOF चरित्र भले ही हम जैसे बयानों लिखने के लिए याद आती है डाल अधिकांश:क्या हम खुद को एक ईओएफ चरित्र लिख सकते हैं?

filestream.close

लेकिन वहाँ किसी भी तरह से है, तो हम EOF चरित्र डाल सकते हैं एक उदाहरण के लिए, हमारी आवश्यकता के अनुसार, सी ++ में। या सी ++ में दिए गए कार्यों का उपयोग करने के अलावा हम किसी भी अन्य विधि का उपयोग कर सकते हैं।

यदि आपको अधिक जानकारी मांगनी है तो कृपया एक टिप्पणी दें।

अग्रिम धन्यवाद।

संपादित करें: अपने समर्थन के लिए धन्यवाद, लेकिन यहाँ इस सवाल का एक अतिरिक्त है:

क्या होगा अगर, हम ओएस चाल और एक फ़ाइल में एक EOF चरित्र जगह है और EOF के बाद कुछ डेटा लिखना चाहते हैं तो एक आवेदन है कि जैसे नोटपैड.एक्सई हमारे ईओएफ चरित्र के बाद पढ़ने में सक्षम नहीं है। मैंने इस विषय से संबंधित प्रश्नों के उत्तर पढ़े हैं और पता चला है कि आजकल ओएस आम तौर पर ईओएफ चरित्र के लिए नहीं देखता है बल्कि फ़ाइल की लंबाई के बारे में जानने के सही विचार को पाने के लिए फ़ाइल की लंबाई की जांच करता है, लेकिन, ओएस में एक प्रक्रिया होनी चाहिए जो फ़ाइल की लंबाई की जांच करेगी और फिर फ़ाइल रिकॉर्ड अपडेट करेगी।

मुझे खेद है कि अगर मैं अपने अनुमान में किसी भी समय गलत हूं लेकिन कृपया मुझे मदद करें तो यह बहुत सारे नए विचारों का कारण बन सकता है।

+1

मुझे बेवकूफ हो जाना चाहिए, क्योंकि मुझे नहीं पता कि इसका क्या अर्थ है। –

+14

आपका मतलब है 'सीपी/एम' (नियंत्रण-जेड) में ईओएफ चरित्र की तरह ??? मुझे नहीं लगता कि पिछले 30 वर्षों में किसी भी ओएस ने फाइल मार्करों के अंत के रूप में ईओएफ पात्रों का उपयोग किया है? –

+1

प्लस ईओएफ सूचक ओएस विशिष्ट है, उदाहरण के लिए यूनिक्स पर यह ctrl-D –

उत्तर

48

कोई ईओएफ चरित्र नहीं है। परिभाषा के अनुसार ईओएफ "किसी वैध चरित्र कोड के लिए असमान है"। अक्सर यह -1 है। यह किसी भी समय फ़ाइल में लिखा नहीं है।

डॉस में एक ऐतिहासिक ईओएफ चरित्र मान (CTRL + Z) है, लेकिन यह इन दिनों अप्रचलित है।

अपूर्व के अनुवर्ती प्रश्न का उत्तर देने के लिए: ओएस फ़ाइल लंबाई निर्धारित करने के लिए कभी भी फ़ाइल डेटा का उपयोग नहीं करता है (फ़ाइलों को किसी भी तरह से 'शून्य समाप्त नहीं किया जाता है)। तो आप ओएस चाल नहीं कर सकते हैं। शायद पुराना, बेवकूफ प्रोग्राम CTRL + Z चरित्र के बाद नहीं पढ़ेगा। मुझे लगता है कि कोई भी विंडोज़ एप्लिकेशन (यहां तक ​​कि नोटपैड) ऐसा नहीं करेगा। मेरा अनुमान है कि उन्हें एक शून्य (\0) चरित्र के साथ चाल करना आसान होगा।

+0

यह पढ़ने पर एक ईओएफ है - हम लेखन के बारे में बात कर रहे हैं। –

+8

मैंने केवल समझाया कि वास्तव में ईओएफ क्या है और यह एक चरित्र कोड नहीं है। मुझे जवाब के साथ आपकी समस्या नहीं दिख रही है। – ypnos

+0

तो मैं एक कस्टम स्ट्रीम लेखक वर्ग की नकल करना चाहता हूं जिसे मैंने कृत्रिम रूप से ईओएफ स्वीकार कर लिया है।इसके लिए कोई उपयोगी उद्देश्य नहीं है सिवाय इसके कि यह मेरे कवरेज परीक्षणों को पूरा करेगा। – Stephen

3

यदि ईओएफ चरित्र से आपका मतलब नियंत्रण-जेड जैसा कुछ है, तो आधुनिक ऑपरेटिंग सिस्टम को ऐसी चीज़ की आवश्यकता नहीं है, और सी ++ रनटाइम आपके लिए एक नहीं लिखेगा। आप निश्चित रूप से खुद को लिख सकते हैं:

filestream.put(26);  // write Ctrl-Z 

लेकिन ऐसा करने का कोई अच्छा कारण नहीं है।

filesystem.close(); 

के रूप में फ़ाइल धारा आप के लिए स्वचालित रूप से बंद कर दिया जाएगा, जब इसके नाशक कहा जाता है ऐसा करने के लिए अच्छा अभ्यास है, लेकिन यह है (मुझे लगता है कि): वहाँ भी ऐसा करने की जरूरत है।

7

असल में सी ++ में fprintf() या ostream तंत्र का उपयोग कर फ़ाइल में लिखा कोई भौतिक ईओएफ वर्ण नहीं है। ईओएफ पढ़ने के लिए कोई और डेटा इंगित करने के लिए एक I/O स्थिति है I

सीपी/एम जैसे कुछ शुरुआती डिस्क ऑपरेटिंग सिस्टमों ने वास्तव में ईओएफ को इंगित करने के लिए एक भौतिक 0x1A (ASCII सब वर्ण) का उपयोग किया क्योंकि फाइल सिस्टम केवल ब्लॉक आकार में फ़ाइल आकार बनाए रखता है ताकि आप कभी नहीं जानते कि फ़ाइल कितनी देर बाइट्स में थी।निर्देशिका में वास्तविक लंबाई की गणना करने के आगमन के साथ अब 'इन-बैंड' फ़ाइल डेटा के हिस्से के रूप में "ईओएफ" चरित्र को स्टोर करने के लिए विशिष्ट नहीं है।

13

अच्छा, EOF सी stdio.h हेडर फ़ाइल में परिभाषित फ़ंक्शन द्वारा केवल एक मान लौटाया गया है। यह वास्तव में ओएस द्वारा सभी पढ़ने के कार्यों में लौट आया, इसलिए इसकी प्रणाली निर्भर है। जब ओएस फ़ाइल के अंत तक पहुंच जाता है, तो यह इसे फ़ंक्शन पर भेजता है, जो कि आमतौर पर (-1) स्थानों की तुलना में इसके वापसी मूल्य में होता है, लेकिन हमेशा नहीं। तो, संक्षेप में, EOF चरित्र नहीं है, लेकिन ओएस द्वारा निरंतर लौटाया गया है। संपादित करें: ठीक है, आप फाइल सिस्टम के बारे में अधिक जानना चाहते हैं, पर this.

हाय देखने की जरूरत है, अपने दूसरे सवाल का:

एक बार फिर से, आप filesystems में बेहतर दिखना चाहिए। एफएटी बहुत अच्छा उदाहरण है, क्योंकि आप इसके बारे में कई लेख पा सकते हैं, और इसके सिद्धांत एनटीएफएस के समान हैं। वैसे भी, एक बार फिर, ईओएफ NOT a character है। आप इसे सीधे फाइल में नहीं रख सकते हैं। यदि आप ऐसा कर सकते हैं, तो परिणामों की कल्पना करें, यहां तक ​​कि "गूंगा" छवि फ़ाइल सिस्टम द्वारा नहीं पढ़ी जा सकती है।

क्यों? Becouse ओएस परतों की बहुत जटिल संरचना की तरह काम करता है। परत में से एक फाइल सिस्टम ड्राइवर है। यह सुनिश्चित करता है कि यह ड्राइवर को ज्ञात प्रत्येक फाइल सिस्टम से डेटा स्थानांतरित करता है। यह एचडीडी में फ़ाइलों को संग्रहीत करने के अनुप्रयोगों और actuall प्रणाली के बीच पुल प्रदान करता है।

सटीक होने के लिए, एफएटी फाइल सिस्टम तथाकथित एफएटी तालिका का उपयोग करता है - यह एचडीडी (या विभाजन) एड्रेस स्पेस की शुरुआत के करीब स्थित एक टेबल है, और इसमें सभी क्लस्टर (छोटे भंडारण कक्ष) का नक्शा शामिल है। ठीक है, तो अब, जब आप कुछ फ़ाइल को एचडीडी में सहेजना चाहते हैं, तो ओएस (फाइल सिस्टम ड्राइवर) एफएटी टेबल में दिखता है, और "0x0" मान की खोज करता है। यह "0x0" मान ओएस को कहता है कि एफएटी तालिका में उस मान के स्थान से कौन सा पता लगाया गया है, क्लस्टर लिखने के लिए स्वतंत्र है।

तो यह फ़ाइल के पहले भाग में लिखता है। इससे भी, यह एफएटी में एक और "0x0" मान ढूंढता है, और यदि पाया जाता है, तो यह फ़ाइल के दूसरे हिस्से को क्लस्टर में लिखता है जो यह इंगित करता है। इससे पहले, यह पहले एफएटी तालिका रिकॉर्ड के मान को बदलता है जहां फ़ाइल हमारे मामले में फ़ाइल के दूसरे भाग में अगले के भौतिक पते पर स्थित है।

जब आपकी फ़ाइल सभी एचडीडी पर संग्रहीत होती है, तो अब अंतिम भाग आता है, यह वांछित ईओएफ मान लिखता है, लेकिन एफएटी तालिका में, एचडीडी के "डेटा भाग" में नहीं। तो जब अगली बार फ़ाइल पढ़ी जाती है, तो यह जानता है कि यह अंत है, आगे देखो नहीं।

तो, अब आप देखते हैं, अगर आप उस स्थान पर मैन्युअल रूप से ईओएफ मान लिखना चाहते हैं, तो आपको अपना खुद का ड्राइवर लिखना होगा जो एफएटी रिकॉर्ड को फिर से लिखने में सक्षम होगा, लेकिन यह व्यावहारिक रूप से है भिखारी के लिए असंभव करना।

+0

महान उत्तर, यह मेरे अनुनय के लिए अधिक है :) –

+0

ठीक है, धन्यवाद। मैं सिर्फ नवागंतुक हूं, अभी भी सीख रहा हूं ... –

+0

ग्रेट स्पष्टीकरण +1 – SeasonalShot

2

आधुनिक फाइल सिस्टम पर ईओएफ एक चरित्र नहीं है, इसलिए फ़ाइल को लिखने के लिए आपको इसे जारी करने की आवश्यकता नहीं है। आपकी प्रक्रिया समाप्त होने पर आपको फ़ाइल को बंद करना होगा या ओएस को आपके लिए यह करना होगा।

+0

मुझे संदेह है: यदि ईओएफ का उपयोग केवल वापसी मूल्य उद्देश्य के लिए किया जाता है और कोई ऐसा चरित्र वास्तव में किसी फ़ाइल में लिखा नहीं जाता है, तो सी प्रोग्राम कैसे निर्धारित करता है कि अंत फ़ाइल तक पहुंच गई है और कोई और इनपुट उपलब्ध नहीं है (wrt फ़ाइल पढ़ें प्रक्रिया)? कृपया इस पर मेरी सहायता करें। –

+1

@ संदीपसिंह - फाइल सिस्टम पर फ़ाइल का आकार निर्धारित करता है कि कोई और इनपुट उपलब्ध नहीं है या नहीं। यदि ईओएफ एक चरित्र था, तो शून्य-बाइट फ़ाइल कैसे मौजूद हो सकती है? स्पष्टीकरण के लिए – mouviciel

+0

धन्यवाद। –

10

मैं कर्नीघान & रिची सी अभ्यास के दौरान जाने के दौरान यहां आया था।

Ctrl +डी चरित्र कि stdio.h से EOF निरंतर से मेल खाता है भेजता है।

(संपादित करें: इस मैक ओएस एक्स पर है, धन्यवाद उनका कहना है कि Windows 10 बराबर Ctrl +जेड है के लिए @markmnl करने के लिए)

+0

धन्यवाद, यह वही है जो मुझे चाहिए। –

+0

Ctrl-Z ने मेरे लिए यह किया (विंडोज 10) – markmnl

4

"EOF" चरित्र के रूप में ऐसी कोई चीज नहीं है । अपने आप में धारा बंद करने का तथ्य "ईओएफ" स्थिति है।

जब आप एक यूनिक्स खोल, कि बस मानक इनपुट धारा, जो बारी में के रूप में "EOF" खोल द्वारा मान्यता प्राप्त है और यह बाहर निकल जाता है बंद कर देता है में Ctrl +डी दबाएँ।

तो, "ईओएफ" भेजने के लिए, बस उस स्ट्रीम को बंद करें जहां "ईओएफ" को भेजने की आवश्यकता है।

1

किसी ने अभी तक [f]truncate सिस्टम कॉल का उल्लेख नहीं किया है, इस तरह आप स्क्रैच से इसे पुनर्निर्मित किए बिना फ़ाइल छोटा बनाते हैं।

truncate() और ftruncate() कार्यों नियमित या fd द्वारा संदर्भित ठीक length बाइट्स का एक आकार करने के लिए कटा हुआ path द्वारा नाम फ़ाइल का कारण है।

यदि फ़ाइल पहले इस आकार से बड़ी थी, तो अतिरिक्त डेटा खो गया है। अगर फ़ाइल पहले छोटा था, तो इसे बढ़ाया गया है, और विस्तारित भाग शून्य बाइट्स ('\0') के रूप में पढ़ता है।

समझें कि यह किसी भी प्रकार के डेटा को फ़ाइल में लिखने से एक अलग ऑपरेशन है। फ़ाइल बाइट्स की रैखिक सरणी है, किसी भी तरह डिस्क पर रखी गई है, मेटाडेटा के साथ यह कहती है कि यह कब तक है; truncate मेटाडाटा बदलता है।

3

विंडोज के तहत, यदि आप stdin में ASCII 26 (EOF) का सामना करते हैं, तो यह शेष डेटा को पढ़ना बंद कर देगा। मेरा मानना ​​है कि इस चरित्र को लिखने से स्टडआउट को भेजे गए आउटपुट को भी समाप्त कर दिया जाएगा, लेकिन मैंने इसकी पुष्टि नहीं की है। आप द्विआधारी मोड as in this SO question को धारा बदल सकते हैं:

#include <io.h> 
#include <fcntl.h> 
... 
_setmode(0, _O_BINARY) 

और न केवल आप बंद हो जाएगा 0x0A 0x0D 0x0A में बदला जा रहा है, लेकिन आप भी/0x1A लिखने के साथ-साथ पढ़ने की क्षमता प्राप्त करेंगे। ध्यान दें कि आपको दोनों stdin (0) और stdout (1) स्विच करना पड़ सकता है।

+0

दोनों stdin, stdout का उल्लेख करने के लिए धन्यवाद। हालांकि यह अभी भी इसके साथ काम नहीं करता है। सी ++ के साथ संकलन एक फर्क पड़ता है? – eleijonmarck

+0

कोई भाषा कोई फर्क नहीं पड़ेगी क्योंकि यह विंडोज एपीआई के साथ एक मुद्दा है। मैं उपर्युक्त कार्यों के कोड की पुष्टि कर सकता हूं, लेकिन सुनिश्चित करें कि आप उस स्ट्रीम की संख्या में 0 को बदल दें जिसे आप स्विच करना चाहते हैं। – Malvineous

+0

ओह, मैं देखता हूं, इसलिए मुझे बाइनरी – eleijonmarck