2008-10-23 14 views
45

बाइनरी मोड में नहीं होने वाली पाठ मोड में खोले गए फ़ाइल को लिखते समय क्या अनुवाद होता है? विशेष रूप में एमएस दृश्य सीद्विआधारी और पाठ मोड में लिखे गए फ़ाइलों के बीच अंतर

unsigned char buffer[256]; 
for (int i = 0; i < 256; i++) buffer[i]=i; 
int size = 1; 
int count = 256; 

द्विआधारी मोड:

FILE *fp_binary = fopen(filename, "wb"); 
fwrite(buffer, size, count, fp_binary); 

पाठ मोड बनाम:

FILE *fp_text = fopen(filename, "wt"); 
fwrite(buffer, size, count, fp_text); 
+0

प्रश्न के लिए प्रेरणा थी कि मैं बाइनरी डेटा कि अनजाने पाठ मोड में डिस्क के लिए लिखा गया था ठीक करने के लिए करना चाहता था – jholl

+0

निकट से संबंधित:।। http://stackoverflow.com/q/ 11981434/183120 – legends2k

उत्तर

35

मेरा मानना ​​है कि अधिकांश प्लेटफार्म धाराओं से निपटने के दौरान "टी" विकल्प या "टेक्स्ट मोड" विकल्प को अनदेखा कर देंगे। खिड़कियों पर, हालांकि, यह मामला नहीं है। आप कम से fopen() समारोह का वर्णन पर एक नज़र डालें, तो:

  • लाइन फ़ीड ('\ n') हो जाएगा: MSDN, आपको लगता है कि "टी" विकल्प को निर्दिष्ट निम्नलिखित असर नहीं होगा देखेंगे आउटपुट
  • कैरिज रिटर्न/लाइन फीड अनुक्रमों को इनपुट पर लाइन फ़ीड्स में अनुवादित किया जाएगा।
  • यदि फ़ाइल संलग्न मोड में खोला गया है, तो फ़ाइल के अंत की जांच की जाएगी एक ctrl-z वर्ण (वर्ण 26) और यदि संभव हो तो उस चरित्र को हटा दिया गया है। यह उस चरित्र की उपस्थिति को फ़ाइल के अंत के रूप में भी समझाएगा। यह सीपीएम के दिनों से एक दुर्भाग्यपूर्ण धारणा है (पाप के पापों के बारे में कुछ माता पिता बी ईिंग ने तीसरे या चौथी पीढ़ी तक अपने बच्चों पर दौरा किया)। पहले बताई गई राय के विपरीत, ctrl-z वर्ण को जोड़ा नहीं जाएगा।
+12

कैरिज रिटर्न वास्तव में '\ r' है, '\ n' लाइन फीड है। –

+0

क्या यह सभी प्रकार के फाइल संचालन के लिए यह व्यवहार करता है? उदाहरण के लिए। फ्रेड और fwrite (जो मुख्य रूप से बाइनरी फाइलों के साथ प्रयोग किया जाता है)? – Calmarius

+0

अनुवाद निर्दिष्ट किया गया है जब फ़ाइल हैंडल खोला जाता है और निम्न स्तर पर होता है। यह उन कार्यों के बावजूद होगा जो आप फ़ाइल को पढ़ने (या लिखने) के लिए उपयोग करते हैं। –

26

पाठ मोड में, एक नई पंक्ति "\ n" एक गाड़ी के लिए परिवर्तित किया जा सकता है वापसी + नई लाइन "\ r \ n"

आमतौर पर आप बाइनरी मोड में खोलना चाहेंगे। पाठ मोड में किसी भी बाइनरी डेटा को पढ़ने की कोशिश नहीं करेगा, यह दूषित हो जाएगा। हालांकि आप बाइनरी मोड में पाठ ठीक पढ़ सकते हैं - यह "\ n" से "\ r \ n" के स्वचालित अनुवाद नहीं करेगा।

इसके अतिरिक्त fopen

+2

पढ़ने के लिए, अनुवाद आप जो वर्णन करते हैं उसके विपरीत काम करता है - "\ r \ n" से "\ n" कनवर्ट करना। –

+2

यह केवल विंडोज़ है? –

+1

टेकोनिक: सभी प्लेटफॉर्म आपको टेक्स्ट मोड निर्दिष्ट करने की अनुमति देंगे , लेकिन यूनिक्स/लिनक्स पर यह बाइनरी मोड से अलग नहीं है। केवल विंडोज़ पर यह एक फर्क पड़ता है। (और संभवतः कुछ और अस्पष्ट प्लेटफ़ॉर्म - आपको सुनिश्चित करने के लिए अपने प्लेटफ़ॉर्म दस्तावेज़ों को जांचना होगा) – MrZebra

5

देखें, जब आप के साथ "आरटी" इनपुट एक Crtl-जेड चरित्र पर समाप्त होता है एक फ़ाइल fopen।

+2

सही - मैं अपने स्वयं के फ़ाइल स्वरूपों को "my-file-type^z" जैसे कुछ के साथ शुरू करता हूं , तो यदि आप कमांड लाइन से "टाइप"/"बिल्ली" टाइप करते हैं, तो यह आपको फ़ाइल की "जादू संख्या" देता है और आपके टर्मिनल पर बाइनरी को स्पूइंग करने के बजाए रुक जाता है। – MrZebra

2

हम जहां फाइलों लाइन समाप्त होने के पात्रों का मिश्रण था पाठ मोड में फ़ाइलों को खोलने के साथ एक दिलचस्प समस्या थी:

1\n\r 
2\n\r 
3\n 
4\n\r 
5\n\r 

हमारी आवश्यकता है कि हम फ़ाइल में हमारे वर्तमान स्थिति को स्टोर कर सकते है (हम fgetpos इस्तेमाल किया), फ़ाइल को बंद करें और फिर बाद में फ़ाइल को फिर से खोलें और उस स्थिति की तलाश करें (हमने fsetpos का उपयोग किया)।

हालांकि, जहां फ़ाइल में लाइन समाप्ति के मिश्रण होते हैं तो यह प्रक्रिया वास्तविक स्थिति की तलाश में विफल रही। हमारे मामले में (हमारा टूल सी ++ पार्स करता है), हम उस फ़ाइल के कुछ हिस्सों को फिर से पढ़ रहे थे जिन्हें हम पहले ही देख चुके थे।

द्विआधारी के साथ जाएं - फिर आप फ़ाइल से जो पढ़ और लिखे गए हैं उसे नियंत्रित कर सकते हैं।

4

एक और अंतर यह जब fseek

का उपयोग कर धारा द्विआधारी मोड में खुला है, नई स्थिति ठीक है ऑफसेट फ़ाइल की शुरुआत से मापा जाता बाइट्स यदि मूल SEEK_SET है, वर्तमान फ़ाइल से है अगर मूल SEEK_CUR है, और फ़ाइल के अंत से यदि मूल SEEK_END है तो स्थिति।कुछ बाइनरी स्ट्रीम SEEK_END का समर्थन नहीं कर सकती हैं।

यदि स्ट्रीम टेक्स्ट मोड में स्ट्रीम खुला है, ऑफसेट के लिए केवल समर्थित मान शून्य हैं (जो किसी भी मूल के साथ काम करता है) और उसी फ़ाइल से जुड़े स्ट्रीम पर std :: ftell को पहले कॉल द्वारा लौटाए गए मान (जो केवल SEEK_SET की उत्पत्ति के साथ काम करता

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