2012-07-19 13 views
5

मेरे पास एक बाइनरी फ़ाइल है जिसे मैं फोरट्रान के साथ पढ़ना चाहता हूं। समस्या यह है कि यह फोरट्रान द्वारा नहीं लिखा गया था, इसलिए इसमें रिकॉर्ड लंबाई संकेतक नहीं हैं। तो सामान्य अनौपचारिक फोरट्रान पढ़ा नहीं जाएगा।क्या फोरट्रान सीधे बाइनरी फ़ाइल से बाइट पढ़ सकता है?

मुझे एक विचार था कि मैं स्नीकी हो सकता हूं और फ़ाइल को एक स्वरूपित फ़ाइल, बाइट-बाय-बाइट (या 4 बाइट्स द्वारा 4 बाइट्स, वास्तव में) एक वर्ण सरणी में पढ़ सकता हूं और फिर वर्णों की सामग्री को रूपांतरित कर सकता हूं ट्रांसफर फ़ंक्शन या ड्रेडेड समकक्ष कथन के माध्यम से पूर्णांक और फ़्लोट्स। लेकिन यह काम नहीं करता है: मैं एक समय में 4 बाइट पढ़ने की कोशिश करता हूं और inquire कथन से पीओएस आउटपुट के अनुसार, पढ़ना 6000 बाइट्स या उससे भी अधिक की तरह छोड़ देता है, और चरित्र सरणी जंक के साथ लोड हो जाती है।

तो यह कोई नहीं है। क्या इस दृष्टिकोण में कुछ विस्तार है जो मैं भूल रहा हूं? या फोर्ट्रान में ऐसा करने के लिए सिर्फ एक मौलिक रूप से अलग और बेहतर तरीका है? (बीटीडब्लू, मैंने integer*1 सरणी और बाइट सरणी में पढ़ने की भी कोशिश की। हालांकि ये कोड संकलित होंगे, जब यह पढ़े गए वक्तव्य पर आया, तो कोड क्रैश हो गया।)

उत्तर

8

हां।

फ़ोरट्रान 2003 ने भाषा में स्ट्रीम पहुंच प्रदान की। इस प्रोसेसर से पहले कुछ विस्तार के बराबर कुछ समर्थित था, जिसे शायद "बाइनरी" या इसी तरह कहा जाता है।

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

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT 
INTEGER, PARAMETER :: unit = 10 
CHARACTER(*), PARAMETER :: filename = 'name of your file' 
INTEGER(C_INT) :: data 
!*** 
OPEN(unit, filename, ACCESS='STREAM', FORM='UNFORMATTED') 
READ (unit) data 
CLOSE(unit) 
PRINT "('data was ',I0)", data 

तुम अब भी endianess और डेटा प्रकार के आकार के साथ मुद्दों हो सकता है, लेकिन वे पहलू भाषा स्वतंत्र हैं।

यदि आप फोरट्रान 2003 से पहले एक भाषा मानक के लिए लिख रहे हैं तो एक उपयुक्त पूर्णांक चर में अनौपचारिक प्रत्यक्ष पहुंच पढ़ने का काम हो सकता है - यह फोरट्रान प्रोसेसर विशिष्ट है लेकिन वर्तमान प्रोसेसर के लिए काम करता है।

+0

बढ़िया काम करता है! धन्यवाद! और मैंने सोचा कि मैं सिर्फ फोरट्रान 9 0 के साथ अच्छा होने के बारे में था। और अब सीखने के लिए और अधिक! ठीक है। बहुत धन्यवाद। –

+1

फोरट्रान पढ़ने के "स्ट्रीम" पहुंच के बिना कुछ डेटा को लंबाई-रिकॉर्ड जानकारी के रूप में व्याख्या कर रहा था। जो दोनों डेटा को छोड़ दिया गया था जिसे आप पढ़ना चाहते थे और रिकॉर्ड की लंबाई गलत होने का कारण बन गया था। इसके अलावा फ़ाइल में वास्तव में फोरट्रान भावना में रिकॉर्ड नहीं हैं। –

+0

@ एमएसबी .: यदि ओपी ने संकेत दिया है, तो उसने पहले स्वरूपित पढ़ने के साथ प्रयास किया, मेरा अनुमान है कि यह तब तक स्कैन किया गया जब तक कि यह एक न्यूलाइन चरित्र नहीं मारा जाता। – janneb

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