2012-01-05 12 views
15

मैं फोर्टन में unformatted फ़ाइलों के प्रारूप को समझ में नहीं आता।फोरट्रान unformatted फ़ाइल प्रारूप

उदाहरण के लिए:

open (3,file=filename,form="unformatted",access="sequential") 
write(3) matrix(i,:) 

एक फ़ाइल में एक मैट्रिक्स के एक स्तंभ आउटपुट। मैंने पाया है कि यह फ़ाइल को किसी भी अंत में 4 बाइट्स के साथ पैड करता है, हालांकि मैं वास्तव में समझ नहीं पा रहा हूं कि क्यों, या इस व्यवहार को कैसे नियंत्रित किया जाए। क्या पैडिंग को हटाने का कोई तरीका है?

धन्यवाद

+2

शीर्षक बदल दिया क्योंकि मैं वास्तव में उस शब्द के भ्रामक उपयोग को नापसंद करता हूं - "बाइनरी"। बाइनरी का मतलब आधार 2 है, जो आपकी समस्या से सीधे जुड़ा हुआ नहीं है। कुछ स्तर पर, आपके कंप्यूटर पर बहुत अधिक बाइनरी है। आजकल यह एक आम शब्द है, लेकिन फोर्टन का "अपरिवर्तित" बहुत करीब है। – Rook

+1

स्ट्रीम के बारे में यहां कुछ उपयोगी जानकारी ... http://www.star.le.ac.uk/~cgp/streamIO.html – Rook

+1

यह http://stackoverflow.com/questions/8751154/ का डुप्लिकेट प्रतीत होता है फोर्टन-ऑन-gnuplot से देख-पर-बाइनरी-आउटपुट-क्या, क्या आप अपना प्रश्न कई बार पोस्ट नहीं कर सकते? – steabert

उत्तर

18

unformated आईओ के लिए, फोरट्रान compilers आम तौर पर शुरुआत और रिकॉर्ड के अंत में रिकॉर्ड की लंबाई में लिखें। अधिकांश लेकिन सभी कंपाइलर चार बाइट्स का उपयोग नहीं करते हैं। यह रिकॉर्ड पढ़ने में सहायता करता है, उदाहरण के लिए, अंत में लंबाई बैकस्पेस ऑपरेशन के साथ सहायता करती है। आप फोर्ट्रान 2003 के नए स्ट्रीम आईओ मोड के साथ इसे दबा सकते हैं, जिसे अन्य भाषाओं के साथ संगतता के लिए जोड़ा गया था। अपने खुले वक्तव्य में पहुंच = 'स्ट्रीम' का उपयोग करें।

+2

एक मामूली नोट के रूप में, कुछ कंप्यूटर्स जैसे कि गोरफ्रान और इंटेल फोरट्रान उप-तारों का उपयोग करके 4 बाइट रिकॉर्ड मार्कर होने के बावजूद 2 जीबी से बड़े रिकॉर्ड रिकॉर्ड करते हैं। – janneb

5

फोरट्रान आईओ रिकॉर्ड आधारित है, स्ट्रीम आधारित नहीं है। हर बार जब आप write() के माध्यम से कुछ लिखते हैं तो आप केवल डेटा नहीं लिख रहे हैं, बल्कि उस रिकॉर्ड के लिए मार्कर शुरू और अंत भी कर रहे हैं। दोनों रिकॉर्ड मार्कर उस रिकॉर्ड का आकार हैं। यही कारण है कि एक ही लिखने में वास्तविकता का एक गुच्छा लिखना (एक रिकॉर्ड: एक स्टार्ट मार्कर, रीयल का गुच्छा, एक एंड मार्कर) अलग-अलग लिखने में प्रत्येक वास्तविक को लिखने के संबंध में एक अलग आकार होता है (एकाधिक रिकॉर्ड, प्रत्येक एक शुरुआत मार्कर, एक असली, और एक अंत मार्कर)। यदि आप बड़े matrices लिख रहे हैं, तो यह बेहद महत्वपूर्ण है, क्योंकि यदि आप अनुचित रूप से लिखे गए हैं तो आप व्यवसाय को गुब्बारे कर सकते हैं।

+3

जो आप कह रहे हैं वह केवल 'अनुक्रमिक' पहुंच – steabert

+1

@steabert के लिए सच है: जो सबसे अधिक (99.9 99%) उपयोग किया जाता है। –

+1

लगभग आधा मेरा कोड 'प्रत्यक्ष' पहुंच का उपयोग करता है - जिससे यह मेरे लिए केवल 50% बना देगा: पी – mgilson

6

मैंने इस सटीक कारण के लिए बिना प्रारूपित आउटपुट के अनुक्रमिक पहुंच का कभी भी उपयोग नहीं किया। हालांकि यह एप्लिकेशन पर निर्भर करता है और कभी-कभी रिकॉर्ड लम्बाई सूचक (विशेष रूप से असंगठित डेटा के लिए) सुविधाजनक होता है। जैसा कि Looking at binary output from fortran on gnuplot में स्टीबर्ट द्वारा सुझाए गए अनुसार, आप कीवर्ड तर्क ACCESS = 'DIRECT' का उपयोग करके इससे बच सकते हैं, इस स्थिति में आपको रिकॉर्ड लंबाई निर्दिष्ट करने की आवश्यकता है। यह विधि बड़े बहु-आयामी संरचित डेटा (निरंतर रिकॉर्ड लंबाई) के कुशल भंडारण के लिए सुविधाजनक है।

REAL(KIND=4),DIMENSION(10) :: a = 3.141 
INTEGER     :: reclen 

INQUIRE(iolength=reclen)a 
OPEN(UNIT=10,FILE='direct.out',FORM='UNFORMATTED',& 
    ACCESS='DIRECT',RECL=reclen) 
WRITE(UNIT=10,REC=1)a 
CLOSE(UNIT=10) 

END 

ध्यान दें कि यह पोर्टेबिलिटी के अर्थ में आदर्श aproach नहीं है: उदाहरण के बाद एक अस्वरूपित फ़ाइल जिसका आकार सरणी के आकार के बराबर होती है लिखता है। प्रत्यक्ष पहुंच के साथ लिखी गई एक गैर-प्रारूपित फ़ाइल में, प्रत्येक तत्व के आकार के बारे में कोई जानकारी नहीं है। एक रीडेमे टेक्स्ट फ़ाइल जो डेटा आकार का वर्णन करती है, मेरे लिए नौकरी ठीक है, और मैं अनुक्रमिक मोड में पैडिंग के बजाय इस विधि को प्राथमिकता देता हूं।

0

फोरट्रान अनफॉर्मेटेड आईओ मैं इंटेल और जीएनयू कंपाइलर्स का उपयोग करके अलग-अलग आउटपुट से काफी परिचित हूं। सौभाग्य से 1 9 70 के आईबीएम के साथ मेरे विशाल अनुभव ने मुझे चीज़ों को डीकोड करने की अनुमति दी। रिकॉर्ड लंबाई प्रदान करते हुए 4 बाइट पूर्णांक काउंटर के साथ जीएनयू पैड रिकॉर्ड। इंटेल एक निरंतर रिकॉर्ड या गिनती के अंत को इंगित करने के लिए 1 बाइट काउंटर और कई एम्बेडेड कोडिंग मानों का उपयोग करता है। एक अभी भी बहुत लंबी रिकॉर्ड लंबाई हो सकती है भले ही केवल 1 बाइट का उपयोग किया जाता है। मेरे पास जीएनयू कंपाइलर द्वारा संकलित सॉफ़्टवेयर है जिसे मुझे संशोधित करना था ताकि यह किसी भी कंपाइलर द्वारा उत्पन्न एक गैर-स्वरूपित फ़ाइल को पढ़ सके, इसलिए इसे पता लगाना होगा कि यह कौन सा प्रारूप पाता है। इंटेल कंपाइलर (जो "पुराने 'आईबीएम दिनों का पालन करता है) द्वारा उत्पन्न एक अनौपचारिक फ़ाइल पढ़ना, जीएनयू के fgetc का उपयोग करके" हमेशा के लिए "लेता है या फ़ाइल को स्ट्रीम मोड में खोलता है। फ़ाइल को कनवर्ट करना जो जीएनयू 100 गुना तक के कारक में परिणाम की अपेक्षा करता है तेज़ी से। यह आपके फ़ाइल आकार पर निर्भर करता है यदि आप पहचान और रूपांतरण से परेशान होना चाहते हैं या नहीं। मैंने अपने कार्यक्रम स्टार्टअप समय को कम किया है (जो एक बड़ी अनफॉर्मेटेड फ़ाइल खोलता है) 5 मिनट से 10 सेकेंड तक। मुझे वापस करने के लिए विकल्पों में जोड़ना पड़ा फिर वापस अगर उपयोगकर्ता फ़ाइल को इंटेल संकलित प्रोग्राम में वापस लेना चाहता है। यह सब दर्द है, लेकिन आप वहां जाते हैं।

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