MFC中CEdit多行情況下,調用GetLine()時,發現老是後面跟有亂碼【轉載】

MFC中CEdit多行情況下,調用GetLine()時,發現老是後面跟有亂碼。即使你把str初始化也是如此。

對於採用GetLine()調用,其函數說明有2種。
1.int GetLine(
   int nIndex,
   LPTSTR lpszBuffer 
) const;
2.int GetLine(
   int nIndex,
   LPTSTR lpszBuffer,
   int nMaxLength 
) const;
  代碼如下:
   char str[10] = {'/0'};
   int nLineNum;//想要獲取的行號
   nLineNum=0;
   m_ctlEditTest.GetLine(nLineNum,str);
Remarks : The copied line does not contain a null-termination character.
看了下msdn,一句話說得很明白,getline做了copy後是不給你加null結束符的。因此需要自己在定義的char字符串末尾添加。而一次實際上會copy回多少個字節。則在該函數的說明中,在msdn中清晰表達爲:
Return Value
  The number of bytes actually copied. The return value is 0 if the line number specified by nIndex is greater than the number of lines in the edit control.
所以,上面的代碼段得用一個值取得實際長度,把多餘的截取掉,但我在用getline1時老是返回0,不知道爲何?不過改成getline2,指定copy9個字節時,同時對第10個字節設置爲null則正常返回,沒有亂碼的出現。如下
  int iLen =  m_ctlEditTest.GetLine(nLineNum,str, 9);
  str[10] = '/0'; 
即可。
。。。。。。。
在cedit中還有個linelength函數,
int LineLength(
   int nLine = -1 
) const;
該函數是應該返回指定行的長度,但是如果不仔細看msdn的說明,很容易誤解nLine是指cedit行中的某一行行數而代入其中,並得到錯誤的結論。
而在msdn中,nLine的說明是:
nLine
Specifies the character index of a character in the line whose length is to be retrieved. If this parameter is –1, the length of the current line (the line that contains the caret) is returned, not including the length of any selected text within the line. When LineLength is called for a single-line edit control, this parameter is ignored.
就是說nLine是字符串的字符索引,在多行情況下所以它必須通過LineIndex函數來獲取。在msdn中如下描述,
   Use the LineIndex member function to retrieve a character index for a given line number within a multiple-line edit control.
而LineIndex函數說明如下:
all this function to retrieve the character index of a line within a multiple-line edit control.
int LineIndex(
   int nLine = -1 
) const;
nLine
Contains the index value for the desired line in the text of the edit control, or contains –1. If nLine is –1, it specifies the current line, that is, the line that contains the caret.
該nLine纔是真正的CEdit中的某一行列。也就是我們通過getlinecount()獲取到cedit的行數後,在到每一行中去找一個character index,再才能確定一行的長度。
有時,覺得mfc是不是有點對個簡單的問題把彎子繞得太遠了點吧。
。。。。
下面摘抄另一種解決方案,採用CString方式來copy一行的長度,我在自己機子測試過,通過GetLine函數1沒有通過,返回的是個空串,而採用GetLine2指定返回一個最大長度時,卻能copy回所要的數據,不過當採用最大長度時,由於拷貝回來的是一個不帶null終結符的串,則存在亂碼。由於工作時間緊張,問題只能採用指定大小的char串處理,但是採用CString串如果不指定大小的方法做一個mark。下列代碼供測試參考。
CString strTemp;
int nLineNum;
nLineNum=0;
m_ctlEditTest.GetLine(nLineNum,strTemp.GetBufferSetLength(m_ctlEditTest.LineLength(m_ctlEditTest.LineIndex(nLineNum))));
strTemp.ReleaseBuffer();
。。。。。。
總而言之,感覺vc中mfc太過於細節,莫免麻煩。但是感覺經歷過一次後,就不再是磕腳的石頭,而是心態的放心。也許,這是心理作用而已。
發佈了21 篇原創文章 · 獲贊 20 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章