close
標題:

[C語言]文字檔內搜尋與取數字問題

 

此文章來自奇摩知識+如有不便請留言告知

發問:

大家好最近工作上需要正在自學C語言但遇到了瓶頸需求是 從xml檔案中於含特定文字的行數中取含小數點數字(其實就是想從Log中擷取需要的結果出來丟在Report上)ex:某行內容是501.65 MB/s1. 我要能指定含Read文字的那一行2. 確定行數後,取中間的數字含小數點(Ans: 501.65)目前核心程式fp_r 來源文字檔fp_r 結果存在文字檔s 字串 while(!feof(fp_r)) { fgets(s, 4096, fp_r); //一行一行抓 ... 顯示更多 大家好 最近工作上需要正在自學C語言 但遇到了瓶頸 需求是 從xml檔案中於含特定文字的行數中取含小數點數字 (其實就是想從Log中擷取需要的結果出來丟在Report上) ex:某行內容是501.65 MB/s 1. 我要能指定含Read文字的那一行 2. 確定行數後,取中間的數字含小數點(Ans: 501.65) 目前核心程式 fp_r 來源文字檔 fp_r 結果存在文字檔 s 字串 while(!feof(fp_r)) { fgets(s, 4096, fp_r); //一行一行抓 if(strstr(s,"Read")||strstr(s,"Write")||strstr(s,"Total") != NULL) //有關鍵字就印出 { fprintf(fp_w, "%s ", s); //把結果存到另一份文字檔 } } 以上內容只能得到有關鍵字的部分 但是卡在不知道怎麼只取字串s內的浮點數 取數字部分目前有找到方法如下 while (1) { r=fscanf(fp_r,"%lf",&d); if (1==r) { printf("%lg ",d); } else if (0==r) { fscanf(fp_r,"%*c"); } else break; } 這樣就只會取數字 但是就沒辦法指定要輸出哪些數字 s這個字串也沒辦法直接丟進去讓他取數字 找了好久都想不到可以同時滿足兩種條件的方法 希望有高手能給些建議 感謝!! 更新: 志恒 您好 感謝您細心的回答 花了一些時間後成功擷取我要的數值 但有2個問題想請教 1. atof("123.456"); /* 123.456000 */ 請問後面多的0是否有辦法消去? (本想到%.2lf,但因每一個數值小數點位數不同沒辦法用) 2. 因為這次每一行字串前面都是空白,所以我只要去空白就能使用 但如果今天的keyword字串前面可能有其他不固定的內容 (ex: "Test1 501.65 MB/s ") 請問是否有更有彈性的方法? 謝謝!!

最佳解答:

可以利用atof 既特性 例: atof("123.456"); /* 123.456000 */ atof("123"); /* 123.000000 */ atof("123.456"); /* 123.456000 */ atof("123.4a6"); /* 123.400000 */ atof("1bc.456"); /* 1.000000 */ atof("abc.456"); /* 0.000000 */ 利用這特性可寫出以下 function // str : eg "123.45 M" // keyword : eg "" // return success(1) failed(0) int CheckKeywordAndGetResult(const char* str,const char* keyword,double* result) { if(!strstr(str,keyword)) return 0; if(result) *result = atof(str + strlen(keyword)); return 1; } // 使用方法 const char* target = "501.65 MB/s"; double result = 0; if(CheckKeywordAndGetResult(target,"",&result)) { printf("result : %f " , result); } // sample code : http://pastebin.com/RwHTkiqN 2014-05-24 01:10:10 補充: 使用正則表達可以滿足到你的要求 // 1.Compile const char* regex = "..." regex_t p; regcomp(&p, regex , REG_EXTENDED|REG_NEWLINE); // 2.Matching regmatch_t match; regexec(&p, str, 1, &match, 0); // 3.Free regfree(&p); // detail sample code:http://pastebin.com/kiH6pvg5

其他解答:

參考下面的網址看看 http://phi008780520.pixnet.net/blog|||||參考下面的網址看看 http://phi008780520.pixnet.net/blogF5B24A77BB847046
arrow
arrow
    創作者介紹
    創作者 elahism 的頭像
    elahism

    elahism的部落格

    elahism 發表在 痞客邦 留言(0) 人氣()