提取文字中任意 浮點數
//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;