基於mfc的大型資料檔案處理方法(轉貼)
基於mfc的大型資料檔案處理方法
在visual c++中,mfc(微軟基礎類庫)提供了cfile和cstdio
file兩個類來進行程式中的檔案輸入輸出操作。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中。函式原型如下:
dword cfile::readhuge(void far *lpbuffer,dword dwco
unt);
void cfile::writehuge(const void far*lpbuffer,dword
dwcount);
在這兩個函式內部使用的都是huge型指標來對傳遞的緩衝區進行
定址,因此可以讀寫大於65535位元組的巨型資料。
對於readhuge()和writehuge()函式需要的巨型緩衝區可以使
用windows的api函式gobalalloc()來建立。
作為乙個例子,下面的程式段演示了通過使用read睭uge()和
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瞨or!」);
} myfile1.readhuge(p,length);
myfile2.readhuge(p,length);
myfile1.close();
myfile2.close();
afxmessagebox(」file copy suc瞔eed!」);
}
基於MFC的大型資料檔案處理方法
基於mfc的大型資料檔案處理方法 在visual c 中,mfc 微軟基礎類庫 提供了cfile和cstdio file兩個類來進行程式中的檔案輸入輸出操作。cfile類提供了基於二 進製流的檔案操作,功能類似於c語言中的fread 和fwrite 函 數。cstdiofile提供了基於字串流的檔案...
處理資料檔案
排序資料 處理大量資料時的乙個常用命令是sort命令,sort命令是對資料進行排序的。預設情況下,sort命令會按照會話的指定的預設語言的排序規對檔案檔案中的資料行排序 k 和 t引數在對按字段分隔的資料進行排序時非常有用,列入 搜尋資料 你會經常需要在大檔案中找一行資料,而這行資料又埋藏在檔案的中...
awk 處理資料檔案
一 資料處理 1 程式 begin end a.dat b.dat merge.dat merge.dat 0 100 0 100 1 99 3 102 2 93 0 93 3 90 2 92nr fnr,只有當處理第乙個檔案a.dat時,這個值才返回true,所以相應的處理是把第二列的數賦值給陣列...