明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

visual c++對(duì)大型數(shù)據(jù)文件的讀取

[摘要]筆者前不久曾遇到一個(gè)問題,解決之后的經(jīng)驗(yàn)愿與大家分享。問題是這樣的,有一批數(shù)據(jù)文件,數(shù)據(jù)格式如下:日期,開盤,最高,最低,收盤,成交量,成交金額1996年5月13日,636.96,636.96,636.96,636.96,0,0,1996年5月14日,641.61,641.61,641.61,64...
筆者前不久曾遇到一個(gè)問題,解決之后的經(jīng)驗(yàn)愿與大家分享。問題是這樣的,有一批數(shù)據(jù)文件,數(shù)據(jù)格式如下:

日期,開盤,最高,最低,收盤,成交量,成交金額

1996年5月13日,636.96,636.96,636.96,636.96,0,0,

1996年5月14日,641.61,641.61,641.61,641.61,0,0,

1996年5月15日,637.83,637.83,637.83,637.83,0,0,

.............

  要求將數(shù)據(jù)填寫到四張表中,以便作相應(yīng)的分析。筆者開始用CFile和CStdioFile類的方法讀取件。Cfile類提供了基于二進(jìn)制流的文件操作,功能類似于C語言中的fread()和fwrite()函數(shù)。CStdioFile提供了基于字符串流的文件操作,功能類似于C語言中fgets()和fputs()函數(shù)。但是筆者發(fā)現(xiàn),使用這兩個(gè)類進(jìn)行文件操作時(shí),對(duì)于一次文件讀寫的數(shù)據(jù)量的大小必須限制在65535字節(jié)以內(nèi)。究其原因是在VC中訪問大于65535字節(jié)的緩沖區(qū)需要Huge型指針,而在CFile和CStdioFile類中,使用的是Far型的指針。由于Far型指針不具有跨段尋址的能力,因此限制了一次文件讀寫的長度小于65535字節(jié)。如果傳遞給CFile和CStdioFile兩個(gè)類的成員函數(shù)的數(shù)據(jù)緩沖區(qū)的大小大于65535字節(jié)的時(shí)候,VC就會(huì)產(chǎn)生ASSERT錯(cuò)誤。

  針對(duì)文件格式特點(diǎn),筆者改用CArchive類進(jìn)行讀取如下:

CFile SourceFile;//數(shù)據(jù)文件

CString SourceData;//定義一臨時(shí)變量保存一條記錄

SourceFile.Open(.......);

CArchive ar(&SourceFile,CArchive::load);

while(NULL!=ar.ReadString(SourceData))//循環(huán)讀取文件,直到文件結(jié)束

{

if(SourceData=="日期,開盤,最高,最低,收盤,成交量,成交金額" SourceData=="")

continue;//跳過文件頭部的提示信息

  //分析并填充//

}

  在進(jìn)行分析時(shí),筆者采取了逐步分析并修改的辦法,過程如下:

int nYear;

CString Year= SourceData.Left(SourceData.Find("年"));//截取年前面的字符串

nYear=atoi(Year);//類型轉(zhuǎn)換

SourceData=SourceData.Righ(SourceData.GetLength()-SourceData.Find("年")-2);//將年以及前面的字符刪除。

  重復(fù)上面分析過程,直到記錄末尾。

  通過上述方法,筆者成功地將文件讀取并分析填充。