2013-04-25 62 views
1

我需要在文件中輸出一個double值。 因此,對於我所有的其他字符串,我必須放棄使用fputs,因爲我認爲它的計算速度快於fprintf。fputs vs. fprintf和double

但是,如果我想把雙倍值我不能這樣做與fputs,所以我試過fprintf。這非常慢。我需要更多的時間,如果我替換fprintf並放置一個fputs(「TEST」,文件);

我怎樣才能把雙倍的字符串一樣快。需要我先將它轉換爲字符串?

我發現了一些轉換。但是,如果我使用它們,我就像使用fprintf一樣慢。

那麼我怎麼能把這個double放到一個文件中如此快呢,就好像我把一個字符串放到了文件中一樣?

fputs("TEST",fileout); //FAST 
    fprintf(fileout, "%f",p); //SLOW 

編輯:

次雙fprintf中:

END.PROCESSING.DATA: 2013-04-26 08:10:33.000 
END.CALC.IN.FILE: 2013-04-26 08:11:13.000 

倍的fputs字符串:

END.PROCESSING.DATA: 2013-04-26 08:14:10.000 
END.CALC.IN.FILE: 2013-04-26 08:14:37.000 

該次代碼:

now = time (0); 
strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now)); 
printf ("END.PROCESSING.DATA: %s\n", buff); 

//output file 
FILE *fileout; 
fileout = fopen("out.txt","w"); 
double p; 
for(i=0; i<17000;i++){ 
    for(j=0; j<i;j++){ 
    for(z=0;z<400;z++){ 
     //DO SOME WORK 
    } 
    p = 1.0; 
    fputs(allsubsts[i],fileout); 
    fputs(";",fileout); 
    fputs(allsubsts[j],fileout); 
    fputs(";",fileout); 
    //fprintf(fileout, "%.21g", p); 
    fputs("TEST",fileout); 
    fputs(";\n",fileout); 
    } 
} 
fclose(fileout); 

now = time(0); 
strftime(buff,100,"%Y-%m-%d %H:%M:%S.000", localtime(&now)); 
printf("END.CALC.IN.FILE: %s\n",buff); 

時間之間的變化只是我把double而不是TEST字符串放在文件中的變化。

+2

該文件是否需要人類可讀? – 2013-04-25 15:19:53

+0

1.它是文本文件還是二進制文件? 2.'%f'爲'float','%lf'爲'double'。 – Crozin 2013-04-25 15:22:35

+2

@Crozin:不,'%f'和'%lf'都是雙重的。沒有辦法將'float'傳遞給'fprintf'。 – 2013-04-25 15:23:23

回答

4

將浮點數轉換爲十進制表示法是一項基本上緩慢的操作。您可以嘗試使用%a說明符代替%f將其存儲爲十六進制浮點數;這應該快得多,並且將安全地保留原始值而不是差的近似值。如果你需要小數,你應該使用%.21g或類似的,而不是%f,因爲後者將失去大部分精度。

如果這對您來說都不夠快,那麼您可能需要直接保存值的二進制表示。

+0

二進制表示是一個非常好的主意,但文件需要由其他程序加載,所以它需要這樣的格式...我會嘗試你的格式 – bladepit 2013-04-25 18:21:01

+0

我編輯了我的代碼更多的例子和信息 – bladepit 2013-04-26 06:15:48