2011-08-22 57 views
7

它看起來很普遍,很明顯,但我已經在C中讀過txt文件,在這裏我真的被卡住了。讀取包含浮動的C文本文件,用空格分隔

我有這種格式

0.00000587898458 0.0014451541000 0.000000000001245 
0.00012454712235 0.1245465756945 0.012454712115140 

的txt文件... 640列和480行。

我想把我的txt文件的每個數字放在一個浮點數中,儘可能使用最大精度,並且在for循環中。

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

的拼寫錯誤,它是&lt; – thomsala

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

你要通過指針,使用& MYVARIABLE代替。修復:

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

對不起,我在這裏複製它時犯了一個錯誤。但是,在我的代碼 – thomsala

+1

中有一個「%0.20f」是無稽之談。 'fscanf'不使用'printf'樣式的寬度/精度。只需使用'%lf'。 –

0
  1. 你說你被卡住,但不進入關於究竟什麼是您所遇到的問題的細節。
  2. 你很可能打算把'myvariable'的地址傳給fscanf。
  3. 即使你不太在意精度(在你的情況下,你明確地說你是做tjat),你應該更喜歡浮點數的兩倍。你應該選擇浮動只有當你有一個非常強烈的理由偏好浮動超過雙重,甚至是,應該在非常特定的情況下。
  4. 總是檢查打電話,以確保它成功。
+0

對不起,這是& – thomsala

2

我只能猜測,因爲你還沒有我們展示了您的實際的源代碼,但...

fscanf"%f"格式期望指向float;你給它一個指向double的指針。這可能是你造成的問題。使用"%lf"代替double(或"%Lf"代替long double)。

是的,這是*printf*scanf函數之間的不一致。它的存在是因爲float參數*printf被提升爲double;有沒有這樣的促銷指針,如float*參數可能會傳遞給fscanf

而只是使用"%lf"而不是"%0.20lf";我不確定後者甚至有效。

+0

的拼寫錯誤,用於在讀取時指向「float」和「double」的不同數據類型。 – Patric

相關問題