前幾天遇到一個小問題,需要將格式如
0 0 524 1049 0.9171 113029 323142 87392 1524 1664 25 0.9973 4537 0.5154 33.1722 33.3961
5938 11 116 253 2.3992 74985 479837 347454 2734 2836 12 0.9974 997 0.4939 26.0862 27.2243
……………………
的txt檔案中的每行數字提取到一個float型數組中,然後在進行後續的判斷。思考了很久終於有了一種解決的辦法。
首先定義CStdioFile file變數,然後用file.open 開啟需要轉換的資料檔案 data.txt 接著while(file.ReadString(str))每次讀取一行的字串到CString類型變數str中。然後調用函數 void transf(CString str,float result[16]) //每行有16個數字
將str轉換成float數組。下面介紹下transf的實現過程。
void transf(CString str,float result[16])
{
int num=str.GetLength(); //得到字串的長度
char *buf;
char tmp[10]={0}; //數字最大的位元
int m;
int * statu;
BOOL F_TRANSF=FALSE; //是否將字串轉換成float數字
int count_str=0; //每取str中一個字元加一
int count_num=0; //每轉換一個float數字加一
buf=(char*)malloc(sizeof(char)* num); //為str中的字串分配記憶體空間
statu=(BOOL*)malloc(sizeof(BOOL)*num); // 為str中每一個字元的狀態分配記憶體空間
memset(statu,-1,num); //初始化狀態
memcpy(buf,str.GetBuffer(0),num); //將str中的字元複製到buf中
for(int i=0; i< num; i++) //每次讀取一個字元
{ m=buf[i]; //m中暫存下字元
if( (m>='0' && m <='9') || m=='.') //如果字元是數字或者是小數點
{ tmp[count_str]=m; //將其存入tmp中,等條件成立時轉換成數字
count_str++;
statu[i]=1; //當前字元狀態為數字或者小數點
}
else if(m == 32 || m== 9 ) //當前字元是否為空白格或者tab鍵(字串中每一行的各個數字以空格或者tab鍵分隔的)
{ statu[i]=0; //當前字元狀態是分隔字元
}
if(count_num==15 && (statu[i-1]==0 && statu[i]==1)) //處理字串中最後一個數字
{
memcpy(tmp,&buf[i],num-i);
result[count_num]=(float)atof(tmp);
}
if(statu[i-1]==1 && statu[i]==0) //如果前一個字元是數字或小數點,後邊一個字元是分隔字元,則將tmp轉換成float數字
{ result[count_num]=(float)atof(tmp);
count_num++;
count_str=0;
memset(tmp,0,10);
}
}
free(buf); //釋放記憶體空間
free(statu);
}
將字串中的數字提取到數組中的方法肯定有很多,說不定一個函數就能實現,還請各位多多指導。