一周作業小結之CString以及GetPrivateProfileString()相關知識
本周在老板的帶領下開始了對相關業務代碼的嘗試,主要作業內容還是在VC 6.0下進行MFC的相關開發,主要內容為獲取本地機器與柜臺機器的網路通信內容,具體來說就是對字串的操作以及牽扯到相關MFC控制元件的使用,下面對這一周以來的開發內容進行相應的總結,主要體現在兩個方面,一是CString的使用,二是對GetPrivateProfilesString()這一函式的相關理解,
一、CString的相關知識
首先介紹一下,CString是MFC下自帶的類,類似于String類,在實際作業程序中主要運用到CString的截取以及CString與LPCTSTR、LPSTR的相關轉化問題,首先來說明CString的截取方法:Left(),Right(),Mid(),
eg.CString str = "aabbccdd";
str.Left(4) = "aabb";//從左起第一位開始往右截取四位
str.right(4) = "ccdd";//截取字串的后4位
str.mid(2)="bbccdd";//從字串索引位2的位置往右截取
str.mid(2,3) = "bbc";//從字串索引為2的位置向后截取3位
下面說明CString與LPCTSTR、LPSTR的相互轉化:
首先,我們應該了解的是,LPCTSTR就相當于const char*,LPSTR相當于char*,
CString與LPCTSTR:
CString str = "aabb";
const char *lpcstr = (LPCTSTR)str;
再重新轉化為CString則需要:CString str(lpcstr);
CString與LPSTR:
LPSTR str = "aabb";
CString cstr;
cstr.Format("%d",str);
再轉化為LPSTR:(LPSTR)(LPCSTR)cstr;//轉化完后cstr即為LPSTR型別,
二、對GetPrivateProfileString()這一函式的相關理解
GetPrivateProfileString()的函式原型:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);
我用該函式來讀取提前配置好的ini檔案,ini檔案的構成如下圖所示

其中[public]與[private]相當于函式引數中的lpAppName,而下面的102、aabb以及node就相當于引數中的lpKeyName,而lpDefaut則代表著一個默認值,當程式沒有從檔案中讀取到資料時,就會以改值充當讀取到的資料,可以設為空值,lpReturnedString是接收ini檔案中=右邊的字串,如上圖中"aaa,bbb,ccc"、"ccdd"、"ttt,kkk",我們需要提前定義一個字串陣列來接收這些字串,nSize代表著該接收字串陣列的大小,所以我們應該針對讀取到的內容,為接收資訊的字串陣列設定合適的大小,最后一個lpFileName則是代表著ini檔案的路徑,筆者在這里建議小伙伴們可以借助于GetModuleFileName()函式,該函式的主要功能是獲取指定模塊的路徑,筆者在這里用于獲取可執行檔案的路徑,而ini檔案就可以跟可執行檔案放在同一目錄下,這樣就可以將lpFileName設定成絕對路徑,在很多情況下可以避免設定成相對路徑所帶來的不必要的麻煩,比如讀取不到檔案等,而筆者在編碼程序中,遇到了GetPrivateProfileString()失敗的問題,經過各種檢查,最后找到了原因,筆者代碼如下圖:

小伙伴們可以看到,筆者的GetPrivateProfileString()中第二個引數為lpctstr,是經過處理轉化后得到的字串,而處理后的字串在記憶體中顯示為:
"102
"
大家可以看到,上文的雙引號并沒有處于同一行中,也就代表著處理后的字串中還包含了末尾的換行符,那么問題就來了,包含了換行符的字串并不能與我設定的ini檔案中的值相匹配,所以就造成了讀取失敗的現象,為此筆者花費了大量的時間檢查,除錯代碼,最終問題出在了這個換行符上,這也是沒有經驗導致的,踩過一次坑,就會銘記于心,,,,,
以上是這周主要的作業內容總結,希望能對碰到類似問題的小伙伴提供幫助,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/246973.html
標籤:其他
上一篇:大資料開發之Hive篇15-Hive之hpl/sql編程
下一篇:后端框架腳手架搭建
