程序调试--基本数据类型的并行化

程序代码

#include <afxwin.h> int _tmain(int argc, _TCHAR* argv[]) { CFile file("file.dat", CFile::modeRead); CArchive ar(&file, CArchive::load); long a, b; ar>>a>>b; return 0; }  

 

CArchive构造的时候,最后一句

m_lpBufCur = (IsLoading()) ? m_lpBufMax : m_lpBufStart;

如果是并行化,则m_lpBufCur = m_lpBufMax; 也就是说当前指针指向了最后的位置。

 

接下来,调用CArchive的operator>>函数。

CArchive& CArchive::operator>>(LONG& l) { if(!IsLoading()) AfxThrowArchiveException(CArchiveException::writeOnly,m_strFileName); if (m_lpBufCur + sizeof(LONG) > m_lpBufMax) FillBuffer(UINT(sizeof(LONG) - (m_lpBufMax - m_lpBufCur))); l = *(UNALIGNED LONG*)m_lpBufCur; m_lpBufCur += sizeof(LONG); return *this; }  

因为当前m_lpBufCur = m_lpBufMax,所以,会调用FillBuffer()来填充缓冲区。然后将当前缓冲区指针转换成LONG指针,读取数值。

 

CArchive::FillBuffer()读取数据填充缓冲区。它的入参nBytesNeeded表明了需要多少字节。

对于块设备,它只读取需要的字节数;对于文件,它从文件中读取数据尽可能塞满缓冲区;对于直接缓冲,它获取下一个m_nBufferSize大小的缓冲区界面。

// nBytesNeeded需要的字节数 void CArchive::FillBuffer(UINT nBytesNeeded) { if(!IsLoading()) AfxThrowArchiveException(CArchiveException::writeOnly,m_strFileName); UINT nUnused = UINT(m_lpBufMax - m_lpBufCur); // 还未使用字节数 ULONG nTotalNeeded = ((ULONG)nBytesNeeded) + nUnused; // 总共需要的字节数 // fill up the current buffer from file if (!m_bDirectBuffer) { if (m_lpBufCur > m_lpBufStart) { // copy unused if ((int)nUnused > 0) { Checked::memmove_s(m_lpBufStart, (size_t)(m_lpBufMax - m_lpBufStart), m_lpBufCur, nUnused); // 将末尾未读取部分移至开头 m_lpBufCur = m_lpBufStart; m_lpBufMax = m_lpBufStart + nUnused; } // read to satisfy nBytesNeeded or nLeft if possible UINT nRead = nUnused; UINT nLeft; UINT nBytes; if (m_bBlocking) // 块设备,例如CSocketFile。对于块设备,只读取需要的部分,避免在不需要的数据上发生阻塞。 nLeft = nBytesNeeded-nUnused; else // 文件设备。填满缓冲区 nLeft = m_nBufSize-nUnused; BYTE* lpTemp = m_lpBufStart + nUnused; // 指向缓冲区中填充数据的位置 do { nBytes = m_pFile->Read(lpTemp, nLeft); lpTemp = lpTemp + nBytes; nRead += nBytes; nLeft -= nBytes; } while (nBytes > 0 && nLeft > 0 && nRead < nTotalNeeded); m_lpBufCur = m_lpBufStart; m_lpBufMax = m_lpBufStart + nRead; } } else { // 在每次通过bufferRead获取缓冲区界面的时候,CMemFile的当前指针都被指向了下一缓冲区界面起始位置 // 所以如果nUnused != 0应该向后调整指针以反映真正未读取的数据。 if (nUnused != 0) m_pFile->Seek(-(LONG)nUnused, CFile::current); UINT nActual = m_pFile->GetBufferPtr(CFile::bufferRead, m_nBufSize, (void**)&m_lpBufStart, (void**)&m_lpBufMax); m_lpBufCur = m_lpBufStart; } // not enough data to fill request? if ((ULONG)(m_lpBufMax - m_lpBufCur) < nTotalNeeded) AfxThrowArchiveException(CArchiveException::endOfFile); }  


 

 

你可能感兴趣的:(File,buffer,UP)