我使用CMemFile::Write()
在内存中写两行:
void CLISTCTRLDlg::Export(LPTSTR *pBlock)
{
CMemFile outMem(32768);
CString csHeader = _T("EmpId EmpName EmpAddress\n");
outMem.Write(csHeader.GetBuffer(0), csHeader.GetLength());
CString csInfo = _T("1 TestName TestAddress\n");
outMem.Write(csInfo.GetBuffer(0), csInfo.GetLength());
long lLen = outMem.GetLength() + 1;
BYTE *mBlock = outMem.Detach();
*pBlock = (LPTSTR) malloc(sizeof(char) * lLen);
memcpy(*pBlock, mBlock, lLen-1);
(*pBlock)[lLen -1] = 0;
OutputDebugStringW(*pBlock);
free(outMem);
}
输出窗口显示字符串“EmpId EmpNam??????????????????”当执行 OutputDebugStringW(* pBlock); 语句时。
我不明白为什么数据会被截断。
此外,当执行语句 free(outMem); 时,系统抛出未处理的异常。
任何人都可以指导我解决方案并让我知道我错在哪里吗?
感谢。
答案 0 :(得分:1)
无需复杂化,存储:
CMemFile file;
CArchive archive(&file, CArchive::store);
CString csHeader = _T("EmpId EmpName EmpAddress\n");
archive << csHeader;
CString csInfo = _T("1 TestName TestAddress\n");
archve << csInfo;
archive.Close();
加载:
file.Seek(0, 0); // rewind the file
CArchive archive(&file, CArchive::load);
CString temp;
archive >> temp;
无需使用memcpy或拨弄内存。
答案 1 :(得分:1)
*pBlock = (LPTSTR) malloc(sizeof(char) * lLen); memcpy(*pBlock, mBlock, lLen-1);
您似乎在其他地方使用宽字符字符串,但这两个调用处理字节。他们应该是:
*pBlock = (LPTSTR) malloc(sizeof(TCHAR) * lLen);
memcpy(*pBlock, mBlock, sizeof(TCHAR) * (lLen-1));
......虽然as Nikola notes,如果你完全避免使用C风格的内存和字符串操作,你会更好。
编辑:执行free(outMem);
时的异常...我不确定为什么即使编译 - outMem
也是你的CMemFile对象,它是堆栈分配的,不是指针。你应该这样做:
free(mBlock); // release memory allocated by, but now detached from CMemFile