2016-01-05 6 views
8

का आकार (बाइट्स) प्राप्त करें मैं एक ASCII टेक्स्ट फ़ाइल पढ़ रहा हूं। यह बाइट्स में, प्रत्येक फ़ील्ड के आकार से परिभाषित किया जाता है। जैसे प्रत्येक पंक्ति में कुछ स्ट्रिंग के लिए 10 बाइट, फ़्लोटिंग पॉइंट वैल्यू के लिए 8 बाइट, एक पूर्णांक के लिए 5 बाइट्स और इसी तरह होते हैं।सी ++ ईओएल

मेरी समस्या न्यूलाइन कैरेक्टर को पढ़ रही है, जिसमें ओएस के आधार पर एक परिवर्तनीय आकार है (आमतौर पर विंडोज़ के लिए 2 बाइट्स और लिनक्स के लिए 1 बाइट मुझे विश्वास है)।

मैं सी ++ में ईओएल चरित्र का आकार कैसे प्राप्त कर सकता हूं?

उदाहरण के लिए, अजगर में मैं कर सकते हैं:

len(os.linesep) 
+4

यदि आप टेक्स्ट मोड में फ़ाइल खोल रहे हैं, तो न्यूलाइन हमेशा '' \ n'' होना चाहिए, जो मूल रेखा समाप्त हो रही है। क्या आपको वास्तव में देशी ईओएल स्ट्रिंग के आकार को जानने की आवश्यकता है? – Badministrator

+0

क्या फ़ाइल उसी ओएस के तहत सहेजी गई है, जैसा कि आपका कोड पढ़ता है, जिस पर यह पढ़ता है? यदि हां, तो फ़ाइल को टेक्स्ट (बाइनरी नहीं) मोड में खोलें। – dxiv

उत्तर

0

मुझे यकीन है कि अनुवाद होता है, जहां आपको लगता है कि यह है नहीं कर रहा हूँ। निम्नलिखित कोड को देखो:

ostringstream buf; 
buf<< std::endl; 
string s = buf.str(); 
int i = strlen(s.c_str()); 

इस के बाद, विंडोज पर चल रहा है, मैं == 1. तो एसटीडी में लाइन परिभाषा के अंत 1 चरित्र है। जैसा कि अन्य ने टिप्पणी की है, यह "\ n" चरित्र है।

+0

यह कोड गलत है क्योंकि सीआरटी lib इन-मेमोरी बफर के लिए '\ n \ '\ r \ n' में नहीं बदलता है, लेकिन यह फाइलों और कंसोल के लिए ऐसा करता है। –

+0

यहां आप जिस समस्या का सामना कर रहे हैं उसका प्रदर्शन कर रहे हैं। एक फ़ाइल/कंसोल पर लिखते समय सी ++ ओएस-विशिष्ट चरित्र में \ n "कन्वर्ट करेगा, लेकिन बफर के लिए नहीं। – jramm

+0

@jramm मुझे नहीं लगता कि आपने अभी तक अपनी समस्या को काफी समझाया है। बफर को लिखे जाने पर \ n' को (और वास्तव में नहीं) को एन्कोड किया जाना आवश्यक नहीं है। लेकिन _when_ आप * टेक्स्ट * मोड में खोले गए फ़ाइल में उस बफर को लिखते हैं, \ n' प्लेटफॉर्म के आदेशों के लिए स्वचालित रूप से अनुवादित किया जाएगा। फिर यदि आप _text_ मोड में एक ही फ़ाइल खोलते हैं और इसे वापस पढ़ते हैं, तो न्यूलाइन अनुक्रम का अनुवाद '\ n'' में किया जाएगा। तो, कम से कम मेरे लिए, यह स्पष्ट नहीं है कि आपको डिस्क पर फ़ाइल में \ n' के एन्कोडिंग को जानने की आवश्यकता क्यों है। – dxiv

1

ऐसा करने का सम्मानित तरीका एक रेखा को पढ़ना है।

अब, अंतिम चार \n होना चाहिए। इसे पट्टी फिर, पिछले चरित्र को देखो। यह या तो \r या कुछ और होगा। यदि यह \r है, तो इसे पट्टी करें।

विंडोज़ [ascii] टेक्स्ट फ़ाइलों के लिए, कोई अन्य संभावनाएं नहीं हैं।

यह फ़ाइल काम करता है भले ही यह काम करता है (उदाहरण के लिए कुछ लाइनें \r\n हैं और कुछ केवल \n हैं)।

आप यह सुनिश्चित करने के लिए कि आप अजीब कुछ नहीं कर रहे हैं, आप इसे कुछ पंक्तियों पर कर सकते हैं।

उसके बाद, अब आप जानते हैं कि अधिकांश फ़ाइल के लिए क्या उम्मीद करनी है। लेकिन, स्ट्रिप विधि सामान्य विश्वसनीय तरीका है। विंडोज़ पर, आपके पास यूनिक्स (या इसके विपरीत) से आयात की गई फ़ाइल हो सकती है।

+0

आधे नाइटपिक, लेकिन लाइन टर्मिनेटर क्या है, यह जानने के बिना 'रेखा को पढ़ना' मुश्किल है। उदाहरण के लिए, आपका नुस्खा '\ r' लाइन टर्मिनेटर के लिए विफल रहता है, और लगातार रिक्त लाइनों को '\ r \ n \ n \ n' के रूप में सहेजा जाता है जो विंडोज़-भूमि में देखे जाते हैं। – dxiv

+1

@dxiv विधि '\ r \ n \ n \ n' (उदा। '\ R \ n \ n \ n') के खिलाफ काम करती है - यह केवल मिश्रित मोड है जैसा कि मैंने उल्लेख किया है [लगातार गैर-समस्या है]। मैंने 20+ सालों में केवल '\ r' फ़ाइल नहीं देखी है [यदि कभी, और मैंने 1000 की फाइलों को परिवर्तित कर दिया है]।कई कार्यक्रमों द्वारा पठनीय नहीं है क्योंकि वे अब [कम से कम] नई लाइन मानते हैं। डॉस 'टाइप फ़ाइल' को एक पर आज़माएं ;-) मुझे नहीं लगता कि एमएस अब भी उनका समर्थन करता है। '\ r' एक लाइन के _beginning_ पर वैध [[गैर-टर्मिनेटर के रूप में] है (उदा। प्रगति आउटपुट कैप्चर)। मैंने उसमें बहुत कुछ देखा है (उदा। '\ Rpgm 56% किया गया है \ rpgm 57% किया गया है ') –

+0

@CraigEstey - पुरानी विद्यालय मैक फ़ाइलें केवल \ r हैं। विकिपीडिया देखें: https://en.wikipedia.org/wiki/Newline – user3690202

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

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