CEdit的问题,大家看看怎么办?

windyloft 2003-12-09 04:30:44
用GetLine取得CEdit的一行内容,
可不知怎么的,取出来的数据比实际的多了几个字节
请高手指点,为什么会这样?如何准确取出每一行的数据
谢谢
...全文
75 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
windyloft 2003-12-09
  • 打赏
  • 举报
回复
谢谢to topwork(日光)
谢谢各位
topwork 2003-12-09
  • 打赏
  • 举报
回复
告诉你为什么吧:
LineLength里面的参数需要带每一行里面的字母某一个字母在全文中的偏移量,这里你带入的数是0,1,2......就肯定不对了,应该是每行的某个字母在全部文章中的位置,因此需要进行转换:
因此起码这里应该这样写:
lLineLen = m_ctrlEditSig.LineLength(m_ctrlEditSig.LineIndex(lCnt));
其次:
GetLine的最后一个参数一定要写成sizeof(cTemp) - 1,否则非常容易出错,不信你就自己试试吧;
codelover 2003-12-09
  • 打赏
  • 举报
回复
是不是没有初始化字符数组?
memset(a, 0, sizeof(a));
windyloft 2003-12-09
  • 打赏
  • 举报
回复
是多行的,怎么了?
windyloft 2003-12-09
  • 打赏
  • 举报
回复
是的
topwork 2003-12-09
  • 打赏
  • 举报
回复
对不起,小声的问一句,你的CEdit是多行的么?
topwork 2003-12-09
  • 打赏
  • 举报
回复
即使不是这个问题也不能这样写;要写成sizeof(...)-1的形式;
另外你是说这段代码会出错是么?
windyloft 2003-12-09
  • 打赏
  • 举报
回复
To:topwork(日光)
不是这个问题,我的数据没有越界
topwork 2003-12-09
  • 打赏
  • 举报
回复
这样写如果行长大于缓冲区长度就糟糕了;
topwork 2003-12-09
  • 打赏
  • 举报
回复
GetLine最后一个参数要写缓冲区的大小(减去1);
GetLine(lCnt , cTemp , sizeof(cTemp) - 1);
windyloft 2003-12-09
  • 打赏
  • 举报
回复
我的程序:大家看看哪不对
int lSigCnt = 0;
int lLineLen = 0;
char cTemp[1024];
CString str;

m_LogToolDoc.m_ListSigData.RemoveAll();
memset(cTemp, '\0', sizeof(cTemp));
lSigCnt = m_ctrlEditSig.GetLineCount();
m_LogToolDoc.m_ListSigData.RemoveAll();
for(int lCnt = 0; lCnt < lSigCnt; lCnt++)
{
memset(cTemp, '\0', sizeof(cTemp));
lLineLen = m_ctrlEditSig.LineLength(lCnt);
m_ctrlEditSig.GetLine(lCnt, cTemp, lLineLen);
if(cTemp[0] != '\0')
{
m_LogToolDoc.m_ListSigData.AddTail(cTemp);
}
memset(cTemp, '\0', sizeof(cTemp));
}
topwork 2003-12-09
  • 打赏
  • 举报
回复
要这样写:
char a[255];
int nRet = m_edit1.GetLine(0 , a , sizeof(a) - 1);
a[nRet] = '\0';
或者
char a[255] = {0};
m_edit1.GetLine(0 , a , sizeof(a)-1);
MSDN上面明确指出,该函数不会吧\0添加到字符串的,因此你必须自己添加,或者初始化为0;
zhucde 2003-12-09
  • 打赏
  • 举报
回复
用我所写的程序测试一点问题也没有啊!
要不让我来看看你的程序
COOL099 2003-12-09
  • 打赏
  • 举报
回复
CEdit::GetLine
int GetLine( int nIndex, LPTSTR lpszBuffer ) const;
int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;

Return Value
The number of bytes actually copied. The return value is 0 if the line number specified by nIndex is greater then the number of lines in the edit control.
你需要要據返回值來顯示實際讀到的字節數.
kongyunzhongque 2003-12-09
  • 打赏
  • 举报
回复

给你一段代码参考一下:
strName = "C:\\"+strName;
CFile file;
if( !file.Open(strName, CFile::modeCreate | CFile::modeWrite) )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << "\n";
#endif
}
pEdit = (CEdit*) GetDlgItem(IDC_EDIT_CONTEXT);

CString strTemp;
pEdit->GetWindowText(strTemp);
strTemp.TrimRight();
pEdit->SetWindowText(strTemp);

char *pbuf;
int nCount = pEdit->GetLineCount();
strTemp.Format("%d",nCount);
AfxMessageBox(strTemp);
for(int i=0;i<nCount;i++)
{
pbuf=new char[pEdit->LineLength(i)+1];
pEdit->GetLine(i,pbuf);
pbuf[pEdit->LineLength(i)]='\0';
file.Write(pbuf,pEdit->LineLength(i));
file.Write("\r\n",2);
AfxMessageBox(pbuf);
delete pbuf;
pbuf =NULL;
}

// CString strTemp;

// pEdit->GetWindowText(strTemp);
// file.Write(strTemp,pEdit->GetWindowTextLength());
pEdit = NULL;
file.Close();
windyloft 2003-12-09
  • 打赏
  • 举报
回复
还是不行
现在问题是:
已知CEdit内内容为“200000000004500000000000000d1d2d3d4000000180000000000000000c1c2c3c400000000000000000000000000000000000000000000000000000000000000000000000052010000d1d2d3d40400000200180000010b001a00000000100530099801a1df7703010203”
通过GetLine函数取的该字符串,有的时候结果正确,可有的时候后面会多出一些乱码。
不知道是什么原因?
zhucde 2003-12-09
  • 打赏
  • 举报
回复
char a[255];
m_edit1.GetLine(1,a);//此处读出值
CString str;
str.Format(a);//通过CString类提供的功能来格式化
MessageBox(str);//现在显示正确了

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧