詳解CAPL?腳本對(duì).ini?配置文件的高階操作
前言
??前面其實(shí)我們已經(jīng)掌握了對(duì)配置文件,文本文件的讀寫函數(shù)和方法,如果一個(gè)INI文件只有少許的鍵值對(duì),那么用內(nèi)置函數(shù)也還湊合,但是當(dāng)INI文件中的鍵值對(duì)多了起來,內(nèi)置函數(shù)一個(gè)一個(gè)去讀寫的方式就非常繁瑣,本節(jié)就針對(duì)這種情況對(duì)INI文件的讀寫方式進(jìn)行升級(jí),以達(dá)到快速便捷讀寫多鍵值對(duì)的情況??
演示軟硬件環(huán)境 Win10 x64 ; CANoe 11 SP2 x64
批量讀取代碼講解
1?? 本節(jié)演示仍然基于 bmw2.cfg
,新增一個(gè)Nework Node
,用于按鍵觸發(fā)測(cè)試
2?? 下圖的test.ini
文件是我們的測(cè)試文件,鍵值對(duì)有很多
3?? 我們按照編程習(xí)慣,控制語(yǔ)句放在IniAuto.can文件中,函數(shù)和全局變量放在IniAuto.cin
文件中IniAuto.can
中代碼:
/*@!Encoding:936*/ includes { #include "IniAuto.cin" } on key 'u' { write("*****press u***********"); getKeyValueFromINI(Ini_data_path,var_Ini_Data); if(1) //debug check values { int i ; write ("************************Debug data******************************"); for(i = 0 ;i < var_Ini_Data.items ;i++) { write ("*******section:%s*******",var_Ini_Data.section[i]); write ("*******index:%d***keys:%s*******",i,var_Ini_Data.keys[i]); write ("*******index:%d***values:%s*******",i,var_Ini_Data.values[i]); } } }
4?? 頭文件 IniAuto.cin
中代碼:
/*@!Encoding:936*/ variables { char Ini_data_path[100] = ".//TestModule//IniAutoCode//test.ini"; char Ini_data_path_out[100] = ".//TestModule//IniAutoCode//test_out.ini"; const int max_items = 200 ; const int max_keys_size = 50 ; const int max_values_size = 300 ; struct Ini_Data // record Ini data { int items; char section[max_items][max_keys_size]; char keys [max_items][max_keys_size]; char values [max_items][max_values_size]; }; struct Ini_Data var_Ini_Data; } /*************************************************************************************************** ---------------------------------------------------------------------------------------------------- Revision history: Date 2022-2-18 Author mayixiaobing 批量讀INI ---------------------------------------------------------------------------------------------------- ***************************************************************************************************/ int getKeyValueFromINI(char FilePath[], struct Ini_Data Temp_var_Ini_Data) { int i,j,glbHandle; char buffer[max_values_size]; long section_find, key_find; char section_temp[max_keys_size]; char keys_temp_1[max_keys_size] ,keys_temp_2[max_keys_size]; char values_temp_1[max_values_size],values_temp_2[max_values_size]; glbHandle = OpenFileRead (FilePath,0); if (glbHandle!=0 ) { write("Open file :%s passed.",FilePath); j = 0; while(fileGetStringSZ(buffer,elcount(buffer),glbHandle)!=0) { section_find = strstr_regex(buffer, "\\[.*?\\]"); //用正則表達(dá)式匹配 [] if(section_find != -1) { ClearCharArray(section_temp); substr_cpy (section_temp,buffer,1,strlen(buffer)-2, elcount(buffer));//掐頭去尾,去掉[] continue ; } key_find = strstr(buffer, "="); if(key_find != -1) { ClearCharArray(keys_temp_1);ClearCharArray(keys_temp_2); //臨時(shí)字符串使用之前要初始化 substr_cpy (keys_temp_1,buffer,0,key_find, elcount(buffer));// = 前的key remove_space(keys_temp_1,keys_temp_2); //清除字符傳中的空格 ClearCharArray(values_temp_1);ClearCharArray(values_temp_2); substr_cpy (values_temp_1,buffer,key_find+1,strlen(buffer) - key_find, elcount(buffer));//= 后的value remove_space(values_temp_1,values_temp_2); strncpy (Temp_var_Ini_Data.section[j],section_temp ,elcount(Temp_var_Ini_Data.section[j])); strncpy (Temp_var_Ini_Data.keys[j] ,keys_temp_2 ,elcount(Temp_var_Ini_Data.keys[j])); strncpy (Temp_var_Ini_Data.values[j] ,values_temp_2 ,elcount(Temp_var_Ini_Data.values[j])); j++; // index ++ } } Temp_var_Ini_Data.items = j ; // 最后統(tǒng)計(jì)多少行數(shù)據(jù) fileClose (glbHandle); } else { write("Read file :%s failed.",FilePath); return 0; //failed } return 1; //passed } /*************************************************************************************************** ---------------------------------------------------------------------------------------------------- Revision history: Date 2022-2-18 Author mayixiaobing 去除字符串的空格 ---------------------------------------------------------------------------------------------------- ***************************************************************************************************/ void remove_space(char input_c[],char out_c[]) { int i,j ; j=0; for(i = 0; i< strlen(input_c);i++) { if (input_c[i] != ' ') { out_c[j] = input_c[i]; j++; } } } /*************************************************************************************************** ---------------------------------------------------------------------------------------------------- Revision history: Date 2022-2-18 Author mayixiaobing 字符串初始化 ---------------------------------------------------------------------------------------------------- ***************************************************************************************************/ void ClearCharArray(char arrIn[]) { int i, length; length = strlen(arrIn); for(i=length;i>=0;i--){ arrIn[i]=0x00; } }
5?? 頭文件 IniAuto.cin
中不良定義解釋
說明:因?yàn)樯婕暗脚坎僮?,所有都化整為零,全?code>key/value的數(shù)據(jù)類型都視為字符串操作,實(shí)際代碼中,如果有整形浮點(diǎn)型的,請(qǐng)?jiān)龠M(jìn)行格式轉(zhuǎn)換
6?? 頭文件 IniAuto.cin
中 getKeyValueFromINI
函數(shù)的注釋
7?? 按鍵’u‘
,看下測(cè)試結(jié)果:
我們已經(jīng)把ini的鍵值對(duì)都轉(zhuǎn)換為了CAPl的數(shù)組類型,那么這樣我們?cè)谙乱徊綗o論怎么去批量讀,改寫,刪除
批量寫入代碼講解
- 1?? 我們讀取了之后,可能的操作是改寫,刪除,添加,甚至是新建操作,那么這一系列操作之后,我們還要保存到原來的INI文件的。
- 2?? 我們按照編程習(xí)慣,控制語(yǔ)句放在IniAuto.can文件中,函數(shù)和全局變量放在
IniAuto.cin
文件中
IniAuto.can
中的增加的代碼:
/*@!Encoding:936*/ on key 'm' { write("*****press m***********"); SetKeyValueToINI(Ini_data_path_out,var_Ini_Data); }
3?? 頭文件 IniAuto.cin
中增加的代碼:
/*@!Encoding:936*/ /*************************************************************************************************** ---------------------------------------------------------------------------------------------------- Revision history: Date 2022-2-18 Author mayixiaobing 批量寫入Key/value 到INI ---------------------------------------------------------------------------------------------------- ***************************************************************************************************/ int SetKeyValueToINI(char FilePath[], struct Ini_Data Temp_var_Ini_Data) { long retVal; int i,j,glbHandle; char buffer[max_values_size]; char section_temp[max_items][max_keys_size]; char tempText[max_values_size]; ClearCharArray(section_temp); glbHandle = OpenFileWrite(FilePath,0); // 寫入文件,以覆蓋源文件的形式 if (glbHandle!=0 ) { write("Open file :%s passed.",FilePath); j = 0 ; for(i=0;i< Temp_var_Ini_Data.items ; i++) { if((strncmp(Temp_var_Ini_Data.section[i],"",strlen(Temp_var_Ini_Data.section[i])) !=0)&& (strncmp(Temp_var_Ini_Data.keys[i], "",strlen(Temp_var_Ini_Data.keys[i])) !=0)) //section、key 值不為空,寫入 { /* section_temp是一個(gè)臨時(shí)字符串?dāng)?shù)組,用來存儲(chǔ)已經(jīng)寫過的section, 每次執(zhí)行寫入前會(huì)先檢查下是否已經(jīng)寫過了,如果沒寫過,就添加到這個(gè)素組中,如果在這個(gè)數(shù)組中找到了,就不再寫入Ini了 */ retVal = SeachValueInArrary(Temp_var_Ini_Data.section[i],section_temp ); if (retVal== -1) { snprintf(tempText, elcount(tempText), "\n[%s]\n", Temp_var_Ini_Data.section[i]); filePutString (tempText, elcount(tempText),glbHandle); strncpy (section_temp[j],Temp_var_Ini_Data.section[i] ,elcount(section_temp[j])); j++ ; } snprintf(tempText, elcount(tempText), "%s = %s\n", Temp_var_Ini_Data.keys[i],Temp_var_Ini_Data.values[i]); //寫入鍵值對(duì) filePutString (tempText, elcount(tempText),glbHandle); } } fileClose (glbHandle); } else { write("Write file :%s failed.",FilePath); return 0; //failed } return 1; //passed } /*************************************************************************************************** ---------------------------------------------------------------------------------------------------- Revision history: Date 2022-2-18 Author mayixiaobing 在一個(gè)中查找指定值 ---------------------------------------------------------------------------------------------------- ***************************************************************************************************/ long SeachValueInArrary(char target[] ,char source[][]) { int i ; for(i= 0;i<elcount(source);i++) { if(strncmp(target,source[i],strlen(target)) ==0 ) { //write("Seached value %s in the arrary and the index is %d",target,i); return i; } } return -1 ; }
4?? 我們?cè)僭诎存I’u‘
,讀取了INI文件后,什么操都不要做,然會(huì)按下’m‘,
看下測(cè)試結(jié)果已經(jīng)都寫進(jìn)來了
更新INI文件鍵值對(duì)
- 1?? 我們讀取了之后,可能的操作是改寫其中的某個(gè)鍵值對(duì),
- 2?? 我們按照編程習(xí)慣,控制語(yǔ)句放在IniAuto.can文件中,函數(shù)和全局變量放在
IniAuto.cin
文件中
IniAuto.can
中的增加的代碼:
on key 'i' //改寫key { write("*****press %c***********",this); updateINIvalue(0,"Tester ","Runer","",var_Ini_Data,Ini_data_path_out); // 改寫第一個(gè)鍵值對(duì)的key,索引值是0,把Tester改成Runer } on key 'p' //改寫value { write("*****press %c***********",this); updateINIvalue(0,"Tester","Tester","https://blog.csdn.net/qq_34414530",var_Ini_Data,Ini_data_path_out); // 改寫第一個(gè)鍵值對(duì)的value,索引值是0, } on key 'k' //改寫value { write("*****press %c***********",this); updateINIvalue(0,"Tester","Runer","https://blog.csdn.net/qq_34414530",var_Ini_Data,Ini_data_path_out); // 對(duì)key和value同時(shí)操做 }
3?? 頭文件 IniAuto.cin
中增加的代碼:
/*************************************************************************************************** ---------------------------------------------------------------------------------------------------- Revision history: Date 2022-2-18 Author mayixiaobing 更改鍵值對(duì),不完善,異常捕捉代碼需完善 ---------------------------------------------------------------------------------------------------- ***************************************************************************************************/ void updateINIvalue(long index ,char section[],char keys[],char values[],struct Ini_Data Temp_var_Ini_Data,char FilePath[]) { if(index < Temp_var_Ini_Data.items) { if(strncmp(section,"",strlen(section)) !=0)// 不等于空,就寫入 { strncpy (Temp_var_Ini_Data.section[index],section ,elcount(Temp_var_Ini_Data.section[index])); } if(strncmp(keys,"",strlen(keys)) !=0)// 不等于空,就寫入 { strncpy (Temp_var_Ini_Data.keys[index] ,keys ,elcount(Temp_var_Ini_Data.keys[index])); } if(strncmp(values,"",strlen(values)) !=0)// 不等于空,就寫入 { strncpy (Temp_var_Ini_Data.values[index] ,values ,elcount(Temp_var_Ini_Data.values[index])); } SetKeyValueToINI(FilePath, Temp_var_Ini_Data); //保存 } else { write("index out of range."); } }
4?? 我們看下測(cè)試結(jié)果
?? 先按鍵’u‘
讀取原始INI,然會(huì)按下’i‘,
改寫Key值:
?? 先按鍵’u‘
讀取原始INI,然會(huì)按下p,
改寫value值:
?? 先按鍵’u‘
讀取原始INI,然會(huì)按下k,
改寫key/value值:
刪除INI文件鍵值對(duì)
- 1?? 我們讀取了之后,可能的操作是改寫其中的刪除某個(gè)鍵值對(duì),
- 2?? 我們按照編程習(xí)慣,控制語(yǔ)句放在IniAuto.can文件中,函數(shù)和全局變量放在
IniAuto.cin
文件中
IniAuto.can
中的增加的代碼:
on key 'h' //刪除鍵值對(duì) { write("*****press %c***********",this); deleteINIItem(3,var_Ini_Data,Ini_data_path_out); // 刪除Peed = 20.5 }
3?? 頭文件 IniAuto.cin
中增加的代碼:
/*************************************************************************************************** ---------------------------------------------------------------------------------------------------- Revision history: Date 2022-2-18 Author mayixiaobing 刪除鍵值對(duì),這里根據(jù)索引去刪除,也可以再重載函數(shù)根據(jù)key值或者value值去刪除 當(dāng)然也可以重載函數(shù),傳入索引數(shù)組,去批量刪除, 后期有時(shí)間再繼續(xù)完善 ---------------------------------------------------------------------------------------------------- ***************************************************************************************************/ void deleteINIItem(long index ,struct Ini_Data Temp_var_Ini_Data,char FilePath[]) { if(index < Temp_var_Ini_Data.items) { strncpy (Temp_var_Ini_Data.section[index],"" ,elcount(Temp_var_Ini_Data.section[index])); strncpy (Temp_var_Ini_Data.keys[index] ,"" ,elcount(Temp_var_Ini_Data.keys[index])); strncpy (Temp_var_Ini_Data.values[index] ,"" ,elcount(Temp_var_Ini_Data.values[index])); SetKeyValueToINI(FilePath, Temp_var_Ini_Data); //保存 } else { write("index out of range."); } }
4?? 我們看下測(cè)試結(jié)果
?? 先按鍵’u‘
讀取原始INI,然會(huì)按下’h‘,
刪除Peed = 20.5:
增加INI文件鍵值對(duì)
- 1?? 我們讀取了之后,可能的操作是增加某個(gè)鍵值對(duì)
- 2?? 我們按照編程習(xí)慣,控制語(yǔ)句放在IniAuto.can文件中,函數(shù)和全局變量放在
IniAuto.cin
文件中
IniAuto.can
中的增加的代碼:
on key 'j' //增加鍵值對(duì) { write("*****press %c***********",this); appendINIItem("Number","place","shanghai",var_Ini_Data,Ini_data_path_out); // 在[Number] 下增加一個(gè)place = shanghai, } on key 'g' //增加鍵值對(duì),新的section { write("*****press %c***********",this); appendINIItem("Position","place","shanghai",var_Ini_Data,Ini_data_path_out); // 在[Number] 下增加一個(gè)place = shanghai, }
3?? 頭文件 IniAuto.cin
中增加的代碼:
/*************************************************************************************************** ---------------------------------------------------------------------------------------------------- Revision history: Date 2022-2-18 Author mayixiaobing 增加鍵值對(duì),下面的代碼支持加入新的section,如果要在已有的section ---------------------------------------------------------------------------------------------------- ***************************************************************************************************/ void appendINIItem(char section[],char keys[],char values[],struct Ini_Data Temp_var_Ini_Data,char FilePath[]) { long retIndex ; long items; long i ; if((strncmp(section,"",strlen(section)) !=0)&& (strncmp(keys ,"",strlen(keys)) !=0)) //section、key 值不為空,寫入 { items = Temp_var_Ini_Data.items ; retIndex = SeachValueInArrary(section,Temp_var_Ini_Data.section); if (retIndex == -1)//如果是新的section,直接尾處追加 { strncpy (Temp_var_Ini_Data.section[items],section ,elcount(Temp_var_Ini_Data.section[items])); strncpy (Temp_var_Ini_Data.keys[items] ,keys ,elcount(Temp_var_Ini_Data.keys[items])); strncpy (Temp_var_Ini_Data.values[items] ,values ,elcount(Temp_var_Ini_Data.values[items])); } else //如果是已有section,從索引處,向后順移 { for(i= items;i > retIndex ;i--) { strncpy (Temp_var_Ini_Data.section[i],Temp_var_Ini_Data.section[i-1] ,elcount(Temp_var_Ini_Data.section[i])); strncpy (Temp_var_Ini_Data.keys[i] ,Temp_var_Ini_Data.keys[i-1] ,elcount(Temp_var_Ini_Data.keys[i])); strncpy (Temp_var_Ini_Data.values[i] ,Temp_var_Ini_Data.values[i-1] ,elcount(Temp_var_Ini_Data.values[i])); } strncpy (Temp_var_Ini_Data.section[retIndex],section ,elcount(Temp_var_Ini_Data.section[retIndex])); strncpy (Temp_var_Ini_Data.keys[retIndex] ,keys ,elcount(Temp_var_Ini_Data.keys[retIndex])); strncpy (Temp_var_Ini_Data.values[retIndex] ,values ,elcount(Temp_var_Ini_Data.values[retIndex])); } Temp_var_Ini_Data.items = items + 1; SetKeyValueToINI(FilePath, Temp_var_Ini_Data); //保存 } }
4?? 我們看下測(cè)試結(jié)果
?? 先按鍵’u‘
讀取原始INI,然會(huì)按下’j‘,
在已有的section新加一個(gè)key/value:
?? 先按鍵’u‘
讀取原始INI,然會(huì)按下’g‘,
新建section以及key/value:
新建INI文件
1?? 我們也可以直接新建一個(gè)鍵值對(duì)文件,不需要提前讀取
2?? 我們按照編程習(xí)慣,控制語(yǔ)句放在IniAuto.can文件中,函數(shù)和全局變量放在IniAuto.cin
文件中
IniAuto.can
中的增加的代碼,下面是新增兩個(gè)參數(shù):
on key 'f' //新建ini文件 { write("*****press %c***********",this); var_Ini_Data.items = 2; strncpy (var_Ini_Data.section[0],"test" ,elcount(var_Ini_Data.section[0])); strncpy (var_Ini_Data.keys[0] ,"para1" ,elcount(var_Ini_Data.keys[0])); strncpy (var_Ini_Data.values[0] ,"1234" ,elcount(var_Ini_Data.values[0])); strncpy (var_Ini_Data.section[1],"test" ,elcount(var_Ini_Data.section[0])); strncpy (var_Ini_Data.keys[1] ,"para2" ,elcount(var_Ini_Data.keys[0])); strncpy (var_Ini_Data.values[1] ,"4567" ,elcount(var_Ini_Data.values[0])); SetKeyValueToINI(Ini_data_path_out,var_Ini_Data); }
3?? 頭文件IniAuto.cin中
增加的代碼:
無新增.cin代碼
4?? 我們看下測(cè)試結(jié)果
到此這篇關(guān)于CAPL 腳本對(duì).ini 配置文件的高階操作的文章就介紹到這了,更多相關(guān)CAPL 腳本.ini 配置文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
性能測(cè)試QPS+TPS+事務(wù)基礎(chǔ)知識(shí)分析
本篇文章是性能測(cè)試基礎(chǔ)篇,主要介紹了性能測(cè)試中對(duì)QPS+TPS+事務(wù)的基礎(chǔ)知識(shí)分析,有需要的朋友可以借鑒參考下,希望可以對(duì)廣大讀者有所幫助2021-09-09訪客站點(diǎn)停留時(shí)間和頁(yè)面停留時(shí)間的實(shí)現(xiàn)方案
這篇文章主要介紹了訪客站點(diǎn)停留時(shí)間和頁(yè)面停留時(shí)間的實(shí)現(xiàn)方案,需要的朋友可以參考下2015-01-01關(guān)于代碼閱讀問題的小技巧 腳本之家原創(chuàng)(適合所有網(wǎng)站)不定時(shí)更新
因?yàn)楹芏嗑W(wǎng)站為了網(wǎng)站的安全,特將一些字符替換成中文字符,導(dǎo)致很多情況下,代碼無法運(yùn)行,或復(fù)制內(nèi)容的適合都是一行顯示,這里將會(huì)為大家整理一些。2011-01-01使用openssl實(shí)現(xiàn)私有CA的搭建和證書的頒發(fā)
這篇文章主要介紹了使用openssl實(shí)現(xiàn)私有CA的搭建和證書的頒發(fā),使用openssl搭建私有CA,openssll和私有CA搭建相關(guān)的配置文件,里面包含了很多和證書相關(guān)的設(shè)置,后續(xù)創(chuàng)建對(duì)應(yīng)文件的時(shí)候需要根據(jù)配置文件中的信息進(jìn)行創(chuàng)建,需要的朋友可以參考下2022-10-10Scala 環(huán)境搭建及IDEA工具的配置使用教程
這篇文章主要介紹了Scala 之 環(huán)境搭建 及 工具IDEA的配置使用,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06postman模擬post請(qǐng)求的四種請(qǐng)求體
本文主要介紹了postman模擬post請(qǐng)求的四種請(qǐng)求體,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01