2010-01-28 2 views
0

Я пишу две строки в памяти с помощью CMemFile::Write():Невозможно скопировать данные, присутствующие в CMemFile с помощью CMemFile :: Detach()

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); Выполняется инструкция.

Я не понимаю, почему данные усечены.

Кроме того, система выдает необработанное исключение, если оператор свободен (outMem);.

Может кто-нибудь, пожалуйста, направит меня к решению и сообщите мне, где я ошибаюсь?

Спасибо.

ответ

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; 

Нет необходимости использовать тетср или скрипку с памятью.

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-стиль и манипуляции строка целиком.

Edit: Что касается исключения при выполнении free(outMem); ... Я не знаю, почему, что даже компилирует - outMem Ваш CMemFile объект, который стек распределённая и не указатель. Вы должны делать:

free(mBlock); // release memory allocated by, but now detached from CMemFile 
+0

Я попробовал, но получил то же исключение. – user196614

+0

Я считаю, что потому, что '(* pBlock) [lLen -1] = 0;' также необходимо обновить, чтобы обрабатывать смещение размера tchar '(* pBlock) [lLen * sizeof (TCHAR)] = 0;' – Ruddy

+0

@ Ruddy: Я так не думаю ... 'pBlock' имеет тип' TCHAR ** ', поэтому индекс, примененный к' (* bBlock) ', будет индексом в массив' TCHAR'. Обратите внимание, что если это был фактически массив байтов, вам нужно было бы сначала передать его в массив TCHAR, чтобы установить двухбайтовый NULL-терминатор! @unknown: я пропустил это прошлой ночью, но ... Ты свободен(), ошибаясь! См. Мое редактирование ... – Shog9