Программирование на языке MFC

Мой второй блог в серии программирования

Метод Write


Естественно, раз существует метод Read(), то, наверное, дол­жен существовать и метод Write(). Действительно, такой метод су­ществует, его исходный код находится в файле агссоге.срр:

void CArchive::Write(const void* lpBuf, UINT nMax) {

ASSERT_VALID(m_pFile);

if (nMax == 0) return;

ASSERT(lpBuf !=NULL);

ASSERT(AfxIsValidAddress(lpBuf, nMax, FALSE));

// read-only access needed

ASSERT(m_bDirectBuffer || m_lpBufStart !=NULL); ASSERT(mjDDirectBuffer || m_lpBufCur !=NULL); ASSERT(m_lpBufStart == NULL ||

AfxIsValidAddress(m_lpBufStart,

m_lpBufMax – m_lpBufStart) ) ; ASSERT(m_lpBufCur == NULL ||

AfxIsValidAddress(m_lpBufCur,

m_lpBufMax – m_lpBufCur) ) ;

ASSERT(IsStoring());

// copy to buffer if possible UINT nTemp = min(nMax, (UINT)(m_lpBufMax – m_lpBufCur)); memcpy(m_lpBufCur, lpBuf, nTemp); m_lpBufCur += nTemp; lpBuf = (BYTE*)lpBuf + nTemp; nMax -= nTemp;

if (nMax > 0) {

Flush(); // flush the full buffer

// write rest of buffer size chunks

nTemp = nMax – (nMax % m_nBufSize); m_pFile->Write(lpBuf, nTemp); lpBuf = (BYTE*)lpBuf + nTemp; nMax -= nTemp;

if (m_bDirectBuffer) {

// sync up direct mode buffer to new file position

VERIFY(m_pFile->GetBufferPtr(CFile::bufferWrite,

m_nBufSize, (void**) &m__lpBufStart, (void**)&m_lpBufMax) == (UINT)m_nBufSize); ASSERT((UINT)m_nBufSize == (UINT)(m_lpBufMax -

m_lpBufStart));

m_lpBufCur = m_lpBufStart;

}

// copy remaining to active buffer ASSERT(nMax < (UINT)m_nBufSize); ASSERT(m_lpBufGur == m_lpBufStart); memcpy(m_lpBufCur, lpBuf, nMax); m_lpBufCur += nMax;

}

}

Назначение аргументов, передаваемых методу, предельно ясно. Первый аргумент – это буфер с данными, подготовленными для записи. Второй аргумент – размер этих данных, т. е. число байтов в буфере, которые необходимо записать в архив.

Похожие статьи: