wsprintf(szByte, "%02X", lpbySrc[i]); lstrcpy(&lpDst[j], szByte); free(lpbySrc); lpbySrc = NULL; CloseHandle(hFileSrc); // 保存到目标文件 hFileDst = CreateFile(szFileDst, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); WriteFile(hFileDst, (LPCVOID)lpDst, lstrlen(lpDst) * sizeof(TCHAR), &dwReaded, NULL); free(lpDst); lpDst = NULL; CloseHandle(hFileDst); } 按说代码写到这里也就该结束了,不过这个话题的确值得就此说开去——可以说,导致上文这种麻烦的“罪魁”,就是C-style string本身的“零结尾”机制。那么我再列出一段代码以供诸位一品: void CString::ConcatCopy(int nSrc1Len, LPCTSTR lpszSrc1Data, int nSrc2Len, LPCTSTR lpszSrc2Data) { // -- master concatenation routine // Concatenate two sources // -- assume that 'this' is a new CString object int nNewLen = nSrc1Len + nSrc2Len; if (nNewLen != 0) { AllocBuffer(nNewLen); memcpy(m_pchData, lpszSrc1Data, nSrc1Len*sizeof(TCHAR)); memcpy(m_pchData+nSrc1Len, lpszSrc2Data, nSrc2Len*sizeof(TCHAR)); } } 如你所见,这是MFC Framework中的CString源码片断。CString为了避免寻找结尾可能造成的尴尬,它的连接函数使用了memcpy而不是strcat/lstrcat,并且由参数给定的字串长度直接确定了字串的尾部位置。那么,可以用CString::operator+=来完成上边的操作吗? 答案还是不可以。我的确说过CString避免了寻找结尾的尴尬,但是CString却带来了另外一个尴尬——重复复制的尴尬。CString::operator+=归根结底是调用了上边的CString::ConcatCopy,并且调用一次CString::ConcatCopy就意味着调用memcpy两次,所以用CString::operator+=则是更得不偿失的一种方法。 无论是C的字符串处理函数还是用C++构造的字符串类,都可以看作是一种“黑箱”。在一般情况下,用户无需了解黑箱内部的实现机理,只要假设“黑箱”是完美的并直接使用就可以了。然而事实上黑箱本身并不是完美万能的——即使这种黑箱是C/C++标准库,也许令你摸不着头脑的错误,就隐藏在那看似完美的黑箱背后。
|
正在阅读:VC++学习:字符串黑箱的背后VC++学习:字符串黑箱的背后
2004-03-01 10:18
出处:CSDN
责任编辑:linjixiong
键盘也能翻页,试试“← →”键