1. 程式人生 > >提取文字中任意 浮點數

提取文字中任意 浮點數

//d.txt為下面一行內容:( 去掉前面的// )
//01.2,3.45;5.6789 -0.12345678901234 abc 1234567890.123456789123456789 1e300 0
#include <stdio.h>
int n,r;
double d;
FILE *f;
void main() {
    f=fopen("d.txt","r");
    n=0;
    while (1) {
        r=fscanf(f,"%lf",&d);
        if (1==r) {
            n++;
            printf("[%d]==%.15lg\n",n,d);//可以試試註釋掉這句以後的速度
        } else if (0==r) {
            fscanf(f,"%*c");
        } else break;
    }
    fclose(f);
}
//實際執行輸出:( 去掉前面的// )
//[1]==1.2
//[2]==3.45
//[3]==5.6789
//[4]==-0.12345678901234
//[5]==1234567890.12346
//[6]==1e+300
//[7]==0


源:  http://bbs.csdn.net/topics/360055953





將大量的文字格式的資料讀入,並轉換成浮點數
pStr是文字資料的指標,例如:"1.0,3.5,2.2 ...",MAX_SUBSTR巨集是資料最大的個數。


char* sm[MAX_SUBSTR], **pb = sm; 


do 

*pb++ = pStr; 
pStr = strchr(pStr,','); 
if(pStr) 
*pStr++ = 0; 
}while(pStr); 


各位童鞋們,上面是改後的程式碼。
我強調這麼少的程式碼,這麼高轉換的效率,能把一個隨便的什麼串,通過指定一個分隔符,就能拆分出一個個字串陣列。
我是感嘆C程式設計的精巧。使用了一個0做串尾的特性和一個指標的特性,就做到了。










有一次,我需要一個二維陣列容納資料,可是問題是:行數有可能為幾百甚至一千。第一行資料可能會挺多,通常為一、二百,極端情況下會接近(不超過)1000,而從第二行開始就少了,通常為幾個到十幾個,極端情況下不超過100個。


如果都按照極限情況處理,這個陣列就得是struct ABC abc[1000]1000],這得佔用很多記憶體,其中絕大部分卻是空的。


為了節約記憶體,我想到了一個辦法,申請一個這樣的陣列:struct ABC abc[1000][100],每行元素只有100,但是第一行極端情況下可能會有千個資料,怎麼辦呢?我採用這樣的辦法:第二行資料從第十一行開始寫,這在我程式中是容易實現的。也就是說,第一行到第十行都留給第一行。因為陣列在記憶體是線性排列的,第一行完了以後接著就是第二行。。。而且讀寫陣列的時候並不進行邊界檢查,這樣,就相當於把第一行到第十行都分給了第一行。 


先計算二維陣列第一維的個數;      //假如是 n
double** abc = new double*[n];
for(int i=0; i<n; i++)
{
   獲取二維陣列第i行的資料個數m;// 這個m每次是變化的。
   abc[i] = new double[m];
}


使用的時候 直接 abc[][] 就可以。


刪除時:
for(int i=0; i<n; i++)
{
  delete [] abc[i];
}
delete [] abc;