2012-04-03 11 views
5

मैं फोर्ट्रान के साथ वर्षों से काम कर रहा हूं, लेकिन फ़ाइल I/O अभी भी मेरे लिए आलसी है। status, form, access, recl की मेरी समझ सीमित है, क्योंकि मैं केवल आवश्यक ग्रेड स्कूल में कुछ उपयोग-मामलों की आवश्यकता है।
मुझे पता है कि फोरट्रान बाइनरी फ़ाइलों में फ़ाइल के आकार का वर्णन करने वाली फ़ाइल के शीर्ष पर अतिरिक्त जानकारी है। लेकिन इससे पहले कभी मेरे लिए कोई मुद्दा नहीं रहा है क्योंकि मुझे केवल फोरट्रान कोड में फोरट्रान फाइलों से निपटना पड़ा है, जहां अतिरिक्त जानकारी जरूरी है, लेकिन अदृश्य है।फोरट्रान में बाइनरी फाइलें खोलना: स्थिति, फॉर्म, एक्सेस

लेकिन मैं फोरट्रान में एक फ्लैट, बाइनरी फ़ाइल कैसे खोलूं?

अतीत में, मैं कुछ इस तरह कर रही द्वारा एक फोरट्रान द्विआधारी फोरट्रान का उपयोग कर खुला हो सकता है:

open(id,file=file_name,status='old', 
    +  form='unformatted',access='direct',recl=4,iostat=ok) 
     if (ok .ne. 0) then 
     write(1,20) id,ok,file_name 
       else 
     write(1,21) id,file_name 

लेकिन यह कैसे कि फोरट्रान हेडर सूचना नहीं है एक फ्लैट, बाइनरी फ़ाइल के लिए यह परिवर्तन करता है ? सबसे महत्वपूर्ण बात यह है कि इन शर्तों का अधिक विस्तार से वर्णन करने के लिए एक अच्छा लिंक कहां है: status, form, access, recl?

+0

ठीक है, जब मैं "सी ++" बाइनरी कहता हूं, तो मेरा मतलब सिर्फ एक कच्ची, सपाट बाइनरी फ़ाइल है जो सी ++ प्रोग्राम द्वारा लिखी गई है। फ़ाइल प्रारूप ... जो कुछ भी होगा, 1-बाइट पूर्णांक की पंक्तियों और स्तंभों से भरा एक फ्लैट बाइनरी। जाहिर है, मेरी प्रमुख चिंता फोरट्रान में एक बाइनरी फ़ाइल पढ़ने की कोशिश कर रही है अगर फ़ाइल में सामान्य फोरट्रान हेडर नहीं है। – theJollySin

+0

फिर जो भी भाषा बनाई गई वह पूरी तरह से अप्रासंगिक है और आपकी वास्तविक समस्या से परेशान है। उसमें संपादित किया गया, और सी ++ टैग हटा दिया गया। – Mat

+0

यह उचित लगता है। मैंने शीर्षक और पाठ में आशा व्यक्त की कि ये सामान्य फोर्ट्रान बाइनरी थे जिन्हें मैं पढ़ने की कोशिश कर रहा था। जब तक यह अभी भी स्पष्ट है, मैं खुश हूं। – theJollySin

उत्तर

8

मुझे ऐसा करने से नफरत है, लेकिन मुझे लगता है कि अगर मैं इस पोस्ट में जवाब ढूंढने की उम्मीद कर रहा था, तो रास्ता आगे स्पष्ट नहीं होगा। तो यहां आगे रास्ता है।

लघु संस्करण

फोरट्रान 77/90 में, एक मानक फोरट्रान बाइनरी फ़ाइल आप लिख सकते हैं खोलने के लिए:

OPEN (5, FILE="myFile.txt") 

लेकिन एक फ्लैट, गैर फोरट्रान बाइनरी फ़ाइल क्या तुम करोगी खोलने के लिए इस तरह कुछ लिखने के लिए है:

OPEN(5, file="myFile.txt", form='unformatted', access='direct', recl=1) 

यह अंतर इसलिए है क्योंकि फोरट्रान स्टाइल बाइनरी फ़ाइलें एक 4-बाइट हैडर और च है फ़ाइल में प्रत्येक "रिकॉर्ड" के आसपास ooter। ये शीर्षलेख/पाद लेख रिकॉर्ड में निहित डेटा के आकार का वर्णन करते हैं। (सबसे आम मामले में, आपके सामने आने वाली प्रत्येक बाइनरी फ़ाइल में केवल एक रिकॉर्ड होगा।)

लांग संस्करण

फोरट्रान डिफ़ॉल्ट open तर्क का एक बहुत रखती है। असल में, हमारे मूल उदाहरण को निम्नलिखित वर्बोज़ फॉर्म में लिखा जा सकता है जो कि सभी डिफ़ॉल्ट दिखाए गए थे। को परिभाषित करता है, तो एक फ़ाइल पाठ (form='formatted') या बाइनरी डेटा (form='unformatted') के होते हैं

  • फार्म:

    OPEN (5, FILE="myFile.txt") 
    OPEN (5, FILE="myFile.txt", FORM="FORMATTED", 
        + ACCESS="SEQUENTIAL", STATUS="UNKNOWN") 
    

    हमें प्रत्येक तर्क पर नजर डालते हैं।

  • पहुंच को परिभाषित करता है, तो आप (access='sequential') में फ़ाइल से डेटा पढ़ रहे हैं या किसी भी क्रम में आप चाहते हैं (access='direct')।

  • आरईसीएल प्रत्येक रिकॉर्ड में जाने वाले बाइट्स की संख्या को परिभाषित करता है। उदाहरण के लिए, recl=1 बस कहता है कि रिकॉर्ड की लंबाई प्रत्येक बाइट 1 बाइट है; शायद वे 1-बाइट पूर्णांक हैं।

  • स्थिति परिभाषित करता है कि फ़ाइल पहले से मौजूद है या नहीं। STATUS="UNKNOWN" तर्क का अर्थ है कि फ़ाइल अभी तक मौजूद नहीं है, लेकिन अगर ऐसा नहीं होता है तो यह बनाया जाएगा। यदि आप पुराने फ़ाइल उपयोग पर लिखने की संभावना के खिलाफ सुरक्षा करना चाहते हैं: STATUS="OLD"। इसी तरह, यदि आप जानते हैं कि फ़ाइल अभी तक मौजूद नहीं है, तो आप इसका उपयोग करना चाहेंगे: STATUS="NEW"

अधिक जानकारी के लिए:

ये खुला बयान भी पढ़ें/लिखें/पास बयान है कि का पालन करेंगे पर प्रभाव पड़ता है। मेरी मूल पोस्ट में, मुझे यह जानना आवश्यक था कि यदि आप प्रत्यक्ष पहुंच फ़ाइल खोलते हैं तो आपको सीधे पहुंच फ़ाइल में लिखना होगा। (यानी, आपके बाइनरी में कोई फोरट्रान हेडर/पाद लेख शामिल नहीं होंगे।) हालांकि, फोरट्रान की डिफ़ॉल्ट कार्यक्षमता फोरट्रान हेडर और पाद लेखों के साथ अनुक्रमिक एक्सेस फ़ाइलों को बनाना है।

फोरट्रान 77/90 में open बयान के बारे में अधिक जानकारी के लिए, वहाँ एक अच्छा ऑनलाइन संसाधन हैं:

A nice page बिशप विश्वविद्यालय के लिन Jinsen द्वारा (आप बहुत बहुत धन्यवाद)।

Slightly more official documentation आईबीएम द्वारा इसके कंपाइलरों के लिए।

1

आप open को access='stream' के साथ फोरट्रान 2003 में नए स्ट्रीम IO मोड का उपयोग करने के लिए बता सकते हैं।

+0

आह, यह शानदार होगा, हां। लेकिन मैं फोरट्रान 77 का उपयोग कर फंस गया हूं। – theJollySin

+4

आप फोरट्रान 77 के साथ कैसे फंस सकते हैं, अब आसपास कोई कंपाइलर नहीं है, जो F90 संकलित नहीं कर सकता है? – haraldkl

+1

@haraldkl - हालांकि बहुत सारे अज्ञानी उपयोगकर्ता हैं, जो नए संशोधन सीखने से इनकार करते हैं, और F77 पर जोर देते हैं, हालांकि मूर्खतापूर्ण हो सकता है। फोरट्रान चतुर्थ क्यों नहीं, मैं हमेशा पूछता हूं? – Rook

5

एक चेतावनी रिकॉर्ड अस्वरूपित रिकॉर्ड के साथ 4 बाइट शब्दों की संख्या को recl चूक में दी गई लंबाई (कम से कम इंटेल compilers पर, byterecl का उपयोग अन्यथा निर्दिष्ट करने के लिए) है, तो आप एक संकलक विकल्प या उपयोग निर्दिष्ट करने के लिए हो सकता है recl=1

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

उपलब्ध हैं, तो आपके संकलक recordtype='stream' अनुमति दे सकता है:

open (id, file=file_name, status='old', form='unformatted' & 
     , access='stream', iostat=ios) 
! read (id, pos=1) someValue 
+0

इंटेल कंपाइलर्स के लिए 4-बाइट शब्दों में recl डिफ़ॉल्ट को निर्दिष्ट करने के लिए धन्यवाद। मुझे आश्चर्यजनक रूप से इंटेल दस्तावेज में इसका उल्लेख नहीं मिला। – umbersar

1

आप धारा पहुँच उपयोग नहीं कर सकते हैं, तो आप सीधी पहुँच का उपयोग करना होगा। this question के उत्तर में लिंक देखें।

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