基於MFC的大型資料檔案處理方法 (轉)

gugu99發表於2008-05-24
基於MFC的大型資料檔案處理方法 (轉)[@more@]

 在Visual C++中,MFC(基礎類庫)提供了CFile和CStdioFile兩個類來進行中的輸入輸出操作。Cfile類提供了基於二進位制流的檔案操作,功能類似於C語言中的fread()和fwrite()。CStdioFile提供了基於字串流的檔案操作,功能類似於C語言中的fgets()和fputs()函式。但是,使用這兩個類進行檔案操作時
,對於一次檔案讀寫的資料量的大小必須限制在65535位元組以內。其原因是在VC中訪問大於65535位元組的緩衝區需要Huge型指標,而在CFile和CStdioFile類中,使用的是Far型的指標。由於Far型指標不具有跨段定址的能力,因此限制了一次檔案讀寫的長度小於65535位元組。如果傳遞給CFile和CStdioFile兩個類的成員函式的資料緩衝區的大小大於65535位元組的時候,VC就會產生ASSERT錯誤。
 筆者在使用Visual C++進行多的時候,由於程式處理的資料量非常大,所以需要頻繁地讀寫大於65535位元組的資料。在使用CFile和CStdioFile類處理巨型資料的時候一般是分段讀寫,筆者感到這樣的處理方法非常地繁瑣,同時容易導致程式編制錯誤。筆者在查閱了相關的文獻以後,找到了使用Visual C++直接讀寫巨型資料的方法。
  在MFC的CFile類中提供了兩個未載入文件的函式,其原型宣告在
AFX.H中。函式原型如下:
D CFile::ReadHuge(void FAR *lpBuffer,DWORD dwCount);
void CFile::WriteHuge(const void FAR*lpBuffer,DWORD dwCount);
  在這兩個函式內部使用的都是Huge型指標來對傳遞的緩衝區進行定址,因此可以讀寫大於65535位元組的巨型資料。對於ReadHuge()和WriteHuge()函式需要的巨型緩衝區可以使用的函式GobalAlloc()來建立。
 作為一個例子,下面的程式段演示了透過使用Read?Huge()和WriteHuge()函式使用一次讀寫複製一個大型檔案的過程。

{ CString Namel(”data1.dat”);
  CString Name2(”data2.dat”);
  CFile MyFilel(Namel,CFile::modeRead);
  CFile MyFile2(Name2,CFile::modeCreate|CFile::mode
  Write);
  DWORD Length=MyFile1.GetLength();
  void far*p=GlobalAlloc(0,Length);
  if(p=NULL)
  {
  AfxMessageBox(”Alloc memory er?ror!”);
  }
  MyFile1.ReadHuge(p,Length);
  MyFile2.ReadHuge(p,Length);
  MyFile1.Close();
  MyFile2.Close();
  AfxMessageBox(”File Copy Suc?ceed!”);

(作者:成都 盧軍)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004512/,如需轉載,請註明出處,否則將追究法律責任。

相關文章