1. 程式人生 > >MFC中CEdit多行情況下,呼叫GetLine()時,發現老是後面跟有亂碼【轉載】

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太過於細節,莫免麻煩。但是感覺經歷過一次後,就不再是磕腳的石頭,而是心態的放心。也許,這是心理作用而已。

相關推薦

MFCCEdit情況呼叫GetLine()發現老是後面亂碼轉載

MFC中CEdit多行情況下,呼叫GetLine()時,發現老是後面跟有亂碼。即使你把str初始化也是如此。 對於採用GetLine()呼叫,其函式說明有2種。 1.int GetLine( int nIndex, LPTSTR lpszBuffer ) co

執行緒的程序呼叫exec將終止整個程序

由於本人才疏學淺,本文難免存在遺漏之處,歡迎大家留言指正,本人將感激不盡。 最近比較好奇,若是一個多執行緒的程序執行exec()系統呼叫時,程序將作何反應,詳情請如下程式碼: #include <stdio.h> #include <st

matlab 遍歷兩層資料夾對兩層資料夾進行改變圖片大小處理轉載

<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-

哥們別逗 了寫個指令碼那真不叫運維自動化! 轉載

好久沒寫文章了,最近要來刷下存在感,近兩年,運維自動化被炒的火的不行,行業趨勢不可擋,現在企業招運維工程師都要求會一門開發語言。我們公司也不例外,由於剛上市,一下子有錢了,開始招兵買馬瞎折騰,因此最近我也面試了不下十來個求職者,本成想可以很容易招到幾個不錯的小夥,結果卻

InnoDB引擎從大表刪除

int ota man erro delete mysql 最小 following 可能 官方建議: InnoDB Tables If you are deleting many rows from a large table, you may exceed the l

SQL 將一條記錄個字段的值拼接為一個字段 && 將數據合並成一行並且拼接CONVERT() 、for xml path的使用

varchar start 技術分享 現在 date rom 結果 技術 ont 接著上篇文章的訂單表(商品編號,價格設置時間id(類似於創建時間,創建時間約早,則act_id越小) ,價格的時間段,商品價格) 一、將一條記錄中多個字段的值拼接為一個字段 現要求將兩個時間

Python版本情況四種快速進入交互式命令的操作技巧

ext 進入 nbsp 情況 交互 菜單 只需要 創建 如何 因為工作需求或者學習需要等原因,部分小夥伴的電腦中同時安裝了Python2和Python3,相信在Python多版本的切換中常常會遇到Python傻傻分不清楚的情況,今天小編整理了四個操作技巧,以幫助大家解決這個

easyui 判斷select拉框是否情況清空預設值

$("#checkType").combobox({ onSelect: function(param){ if (param

sqlserver如何把一列資料在一行顯示

SQL code問題描述: 無論是在sql 2000,還是在 sql 2005 中,都沒有提供字串的聚合函式, 所以,當我們在處理下列要求時,會比較麻煩: 有表tb, 如下: id value ----- ------ 1 aa 1 bb 2

GridView存在資料如何獲取資料表主鍵值以對某一整資料進行編輯

 <%-- asp.net初學者,還請大神多多提點--%> 程式碼如下: protected void grvMHN_RowEditing(object sender, GridViewE

sql 如何同時更改一列

sql如圖,我要把 pre_tel 列 都加上 010 或者其他區號,但是如何用同一條 sql 語句實現?sql 如何同時更改一列中的多行值

循環刪除DataTable.Row問題

datarow for datatable eight nbsp family let -- 永遠 在C#中,如果要刪除DataTable中的某一行,大約有以下幾種辦法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows

在函數被裝飾的情況如何取消裝飾器訪問原始函數

date 訪問 tool ror 幫助信息 函數 auth art run 在函數被裝飾器裝飾的情況下,需要保持原始函數的文檔,幫助信息等信息,或者直接調用原始函數,此時需要引入wraps模塊 #!/usr/bin/env python #coding:utf-8 [em

mysql查詢結果合並成一個(轉)

get asc 數據 利用 sel tor _id and ont SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND md.mimetype_id= 5 AND

SQL中將某個表數據在一個字段顯示

ack 查詢 style 顯示 isp dex OS AC for 項目需求:將某個表中的多行數據在一個字段顯示,如下: 比如表A中有字段 ID,NAME, 表B中有字段ID,PID,DES, 表A,表B中的數據分別如下: ID NAME1 張三2 李四 ID PID DE

SoapUI code 顯示設置

ngs adding 們的 git ces auto AS The strong 你們的SoapUI 有設置下面的選項嗎? 1. Before adding your project, we recommend that you enable the follo

輸入輸出流讀取本機txt文件:不能將中文字元流轉化為char 因為char一個位元組中文在UTF-8的情況是三個位元組會出現字元流擷取

package interview; import org.junit.Test; import java.io.*; public class TestInOrOutStream { class m { @Test void x(){ Sys

不刪除資料情況轉換檔案系統型別從FAT32轉到NTFS

轉換檔案系統型別,從FAT32轉到NTFS(不刪除資料) 如果是從NTFS轉FAT32就不能用下面的方法,需要備份你的資料之後再格式化 最近下完電影想把電影傳到U盤裡,結果顯示檔案過大不能傳,然後看了看我的U盤屬性是FAT32,FAT32是不支援4G以上的檔案傳輸的,所以需要改變

elementUI el-select 情況包含全部選項,及獲得選中項的label

<template> <div> <span style="margin-left:30px;font-weight:bolder;">教練: <el-select v-model="staffId" pla