2011-06-24 12 views
6

में अल्पविराम-सीमित टेक्स्ट फ़ाइल लाइन-दर-पंक्ति पढ़ना मैं एक फोरट्रान नौसिखिया हूं। मैं एक टेक्स्ट फ़ाइल को पढ़ने और व्यक्तिगत चर में अपनी सामग्री को सहेजने में सक्षम होना चाहता हूं। मुझे एक बहुत ही उपयोगी फोरट्रान ट्यूटोरियल (http://www.math.hawaii.edu/~hile/fortran/fort7.htm#read) मिला, और मैं वहां सूचीबद्ध उदाहरणों में से एक का पालन करने की कोशिश कर रहा हूं।फोरट्रान

1.23, 4.56, 7.89 
11, 13, "Sally" 

मैं अपने वर्तमान निर्देशिका में इस पाठ फ़ाइल सहेज लें: विशेष रूप से, मैं कहा जाता है एक पाठ फ़ाइल निम्न पाठ के साथ data.txt बनाया है। फिर, मैं एक फ़ाइल बनाया है test.f90 (भी मेरे वर्तमान निर्देशिका में यह बचत) युक्त निम्नलिखित कोड:

PROGRAM test 
    IMPLICIT NONE 

    REAL :: x, y, z 
    INTEGER :: m, n 
    CHARACTER first*20 

    OPEN(UNIT = 7, FILE = "data.txt") 
    READ(7,*) x, y, z 
    READ(7,*) m, n, first 

    PRINT *, x 
    PRINT *, y 
    PRINT *, z 
    PRINT *, m 
    PRINT *, n 
    PRINT *, first 
END PROGRAM test 

मैं जीएनयू फोरट्रान संकलक, जो मुझे लगता है कि ऊपर कम से कम विशेषताएं शामिल उपयोग कर रहा हूँ फोरट्रान 9 5 सहित। उपरोक्त कोड कम से कम डिफ़ॉल्ट सेटिंग्स के साथ संकलित करने के लिए प्रतीत होता है)। लेकिन जब मैं जिसके परिणामस्वरूप निष्पादन योग्य चलाने के लिए, मैं इस त्रुटि संदेश मिलता है:

At line 10 of file test.f90 (unit = 7, file = 'data.txt') 
Fortran runtime error: End of file 

रेखा 10 लाइन पढ़ें (7, *) मी, एन, पहले है। क्या आप कृपया मुझे यह देखने में मदद कर सकते हैं कि मैं उपरोक्त कोड में क्या गलत कर रहा हूं?

+0

इसे किसी अन्य इकाई संख्या (> 10) के साथ आज़माएं। शायद आपका कंपाइलर प्रीकनेक्टेड डिवाइस के लिए यूनिट 7 का उपयोग करता है। – eriktous

+0

@eriktous: आपके समय के लिए बहुत बहुत धन्यवाद, लेकिन दुर्भाग्यवश यह समस्या को ठीक नहीं करता है (कम से कम जब मैं 15 की इकाई का उपयोग करता हूं)। सलाह के लिए धन्यवाद, यद्यपि; यह जानना वाकई अच्छा है कि 10 या उससे कम की इकाइयों का उपयोग प्रीकनेक्टेड उपकरणों के लिए कंपाइलर द्वारा किया जा सकता है। मैं इसे ध्यान में रखूंगा। धन्यवाद! – Andrew

उत्तर

2

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

असल में, रनटाइम एक रेखा को पढ़ने की कोशिश करता है, लेकिन लाइन के अंत तक पहुंचने से पहले एक अंत-फ़ाइल फ़ाइल का सामना करता है।

3

जब मैं आपका नमूना कार्यक्रम, आपके नमूना डेटा के साथ, यह काम करता है! बधाई! आउटपुट था:

1.2300000  
    4.5599999  
    7.8899999  
      11 
      13 
Sally 

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

+0

मैंने वास्तव में मूल रूप से माइक्रोसॉफ्ट एडिटर के साथ अपनी टेक्स्ट फाइल बनाई: विंडोज एक्सपी पर नोटपैड। अभी मैंने एक ही टेक्स्ट युक्त एक नई टेक्स्ट फ़ाइल बनाई है, लेकिन इस बार XEmacs का उपयोग करके लिखा गया है और 7 या 15 के बजाय 16 के यूनिट मान का उपयोग कर दुर्भाग्यवश, यह अभी भी नहीं चलेगा। जिज्ञासा से बाहर, आप किस पाठ संपादक की सिफारिश करते हैं? साथ ही, क्या यह हो सकता है कि शायद कुछ फोरट्रान बोलियों में "टर्मिनेटर कैरेक्टर" हो? उदाहरण के लिए मुझे पता है कि सी में, प्रत्येक पाठ फ़ाइल को "\ 0" या शून्य सूचक के साथ समाप्त होना चाहिए, मुझे लगता है। – Andrew

+0

XEmacs के बारे में कुछ असाधारण है। जब मैं vi का उपयोग करके टेक्स्ट फ़ाइल बनाता हूं, तो यह काम करता है, और मुझे वही आउटपुट मिलता है जैसा आपने किया था।मैं जीएनयू फोरट्रान कंपाइलर (gfortran) का उपयोग कर रहा हूँ; क्या आप इसका इस्तेमाल भी कर रहे हैं? – Andrew

+1

मै मैक ओएस एक्स के साथ गोरफ्रान का उपयोग कर रहा हूं। संपादक के बावजूद, निष्पादन योग्य ओएस के लाइन टर्मिनेटर को लाइन के अंत में अंतिम पंक्ति सहित उम्मीद करता है। जैसा कि @रिकटस ने लिखा है, लाइन टर्मिनेटर प्राप्त करने के लिए एंटर का उपयोग करना सुनिश्चित करें। माइक्रोसॉफ्ट प्रोग्राम अक्सर गलत टर्मिनेटर का उपयोग करते हैं, जो गैर-स्पष्ट समस्याओं का भी कारण बनता है। –

2

कुछ कंप्यूटर्स के लिए डेटा के साथ अंतिम पंक्ति के बाद एक नई लाइन जोड़ना महत्वपूर्ण है। उदाहरण के लिए gfortran एक कंपाइलर है जिसकी आवश्यकता है और यह काफी तार्किक है। सूर्य (ओरेकल) कंपाइलर की आवश्यकता नहीं है।

+0

क्या यह मूल रूप से वही नहीं है जैसा मैंने कहा था? – eriktous

+0

हां, यह है। मुझे तुरंत पढ़ने के बाद इसका एहसास नहीं हुआ। मैं मुख्य रूप से विभिन्न संपादकों के बारे में थोड़ा गुमराह चर्चा पढ़ता हूं। –

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