2011-08-22 16 views
7

द्वारा अलग किया गया यह सामान्य और स्पष्ट दिखता है लेकिन मैंने पहले ही सी में txt फ़ाइल पढ़ी है और यहां मैं वास्तव में अटक गया हूं।सी युक्त फ्लोट में एक .txt टेक्स्ट फ़ाइल पढ़ना, स्पेस

मैं इस प्रारूप

0.00000587898458 0.0014451541000 0.000000000001245 
0.00012454712235 0.1245465756945 0.012454712115140 

की एक txt फ़ाइल ... 640 स्तंभों और 480 लाइनों के साथ की है।

मैं अपनी प्रत्येक टीटीटी फ़ाइल को अधिकतम परिशुद्धता के साथ फ्लोट में रखना चाहता हूं, और संभवतः लूप में रखना चाहता हूं।

FILE* myfile=NULL; 
double myvariable=0.0; 
myfile=fopen("myfile.txt","r"); 

for(i =0, k=0 ; i< height; i++) 
    for (j=0 ; j< width ; j++){ 
fscanf(myfile,"%0.20f",&myvariable); 
printf("%0.20f",myvariable); 
k++; 
} 
} 
fclose(myfile); 

आप आपकी मदद

+1

क्या काम नहीं कर रहा है? – arnaud576875

+0

यह सिर्फ कुछ भी नहीं पढ़ता है, यह शून्य से भरा है लेकिन सही परिशुद्धता 0.00000000000 के साथ है। मैंने अपना पहला नंबर बदलने की कोशिश की और यह अभी भी वही है। – thomsala

+2

चेतावनियों को अनदेखा करना बहुत बुरा अभ्यास है –

उत्तर

8

अपने कार्यक्रम में कई त्रुटियाँ हैं - बेमेल ब्रेसिज़, अपरिभाषित चर, आदि सबसे महत्वपूर्ण यह है कि आप myvariable के लिए सूचक गुजर नहीं कर रहे हैं तथापि, और एक सबसे अपनी समस्या का कारण होने की संभावना है, आपके fscanf() कॉल में। आप वहां &myvariable का उपयोग करना चाहेंगे, ताकि fscanf() इसे उचित रूप से भर सके। आपको शायद जटिल स्ट्रिंग की आवश्यकता नहीं है, या तो "%lf" को double पढ़ने के लिए ठीक काम करना चाहिए। वास्तव में, gcc अपने प्रारूप स्ट्रिंग के साथ मुझे चेतावनी देते हैं:

example.c:16: warning: zero width in scanf format 
example.c:16: warning: unknown conversion type character ‘.’ in format 

और फिर मेरी उत्पादन सिर्फ 0. "%lf" प्रयास करें हो जाता है।

#include <stdio.h> 

#define HEIGHT 2 
#define WIDTH 3 

int main(void) 
{ 
    FILE *myfile; 
    double myvariable; 
    int i; 
    int j; 

    myfile=fopen("myfile.txt", "r"); 

    for(i = 0; i < HEIGHT; i++) 
    { 
    for (j = 0 ; j < WIDTH; j++) 
    { 
     fscanf(myfile,"%lf",&myvariable); 
     printf("%.15f ",myvariable); 
    } 
    printf("\n"); 
    } 

    fclose(myfile); 
} 

उदाहरण चलाएँ:: यहाँ अपने नमूना इनपुट के साथ एक पूर्ण काम कर उदाहरण है

$ ./example 
0.000005878984580 0.001445154100000 0.000000000001245 
0.000124547122350 0.124546575694500 0.012454712115140 
+0

के लिए एक टाइपो था क्योंकि यह – thomsala

2
fscanf(myfile,"%0.20f",myvariable); 

के लिए बहुत बहुत धन्यवाद आप एक सूचक पारित बजाय & myvariable उपयोग करना होगा। ठीक करें:

fscanf(myfile, "%lf", &myvariable); 
+0

हाँ क्षमा करें जब मैंने इसे कॉपी किया तो मैंने गलती की। लेकिन मेरे कोड में – thomsala

+1

'% 0.20f' बकवास था। 'fscanf'' printf'-style width/precision का उपयोग नहीं करता है। बस '% lf' का प्रयोग करें। –

0
  1. आप कहते हैं कि आप अटक रहे हैं, लेकिन के बारे में वास्तव में समस्या आप का सामना कर रहे है क्या बारीकियों में नहीं मिलता है।
  2. आप संभवतः 'myvariable' के पते को fscanf में पास करने का इरादा रखते हैं।
  3. भले ही आपको परिशुद्धता के बारे में बहुत परवाह नहीं है (और आपके मामले में, आप स्पष्ट रूप से कहते हैं कि आप करते हैं), आपको फ्लोट पर डबल पसंद करना चाहिए। आपको केवल तभी फ़्लोट करना चाहिए जब आपके पास डबल पर फ्लोट पसंद करने के लिए बहुत मजबूत कारण हो, और यहां तक ​​कि, यह बहुत विशिष्ट स्थितियों में होना चाहिए।
  4. हमेशा यह सुनिश्चित करने के लिए फॉपेन पर कॉल की जांच करें कि यह सफल हुआ।
+0

क्षमा करें यह – thomsala

2

मैं केवल, अनुमान लगा सकते हैं के बाद से आप हमें अपने वास्तविक स्रोत कोड नहीं चला है, लेकिन ...

fscanf का "%f" प्रारूप एक सूचक को float पर उम्मीद करता है; आप इसे double पर पॉइंटर दे रहे हैं। शायद यही समस्या है जो आप देख रहे हैं। "%lf"double (या "%Lf"long double के लिए) का उपयोग करें।

हां, यह *printf और *scanf फ़ंक्शंस के बीच एक असंगतता है। यह अस्तित्व में है क्योंकि float*printf पर तर्क double पर प्रचारित हैं; पॉइंटर्स के लिए ऐसा कोई प्रचार नहीं है, जैसे कि float* तर्क जो आप fscanf पर जा सकते हैं।

और "%lf" का उपयोग करें, "%0.20lf" नहीं; मुझे यकीन नहीं है कि उत्तरार्द्ध भी वैध है।

+0

के लिए एक टाइपो था जो पढ़ने के लिए "फ्लोट" और "डबल" के विभिन्न डेटा प्रकार को इंगित करने के लिए उपयोगी था। – Patric

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