一週工作小結之CString以及GetPrivateProfileString()相關知識

一週工作小結之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文件中的值相匹配,所以就造成了讀取失敗的現象,爲此筆者花費了大量的時間檢查,調試代碼,最終問題出在了這個換行符上,這也是沒有經驗導致的,踩過一次坑,就會銘記於心。。。。。

 

以上是這周主要的工作內容總結,希望能對碰到類似問題的小夥伴提供幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章