MFC二進制文件讀取


1、mfc Document-vew doc類中讀取

doc類中讀取,在Vew類中可直接使用。

在菜單欄NewFile/OpenFile 后,系統自動調用Serialize()函數

if :寫入文件

else:讀取文件

eg:讀取二進制文件(結構體數據)

// ChlDoc 序列化

void ChlDoc::Serialize(CArchive& ar)
{
	TRACE(TEXT("DOC"));
	if (ar.IsStoring())
	{
		// TODO: 在此添加存儲代碼
	}
	else
	{
		
		// TODO: 在此添加加載代碼
		int dataSize = sizeof(StockDay);//結構體長度
		CFile* fp = ar.GetFile();
		int fLenght = fp->GetLength();//文件長度
		int num = fLenght/dataSize;//列表長度
		for(int i = 0; i<num; ++i)
		{
			StockDay sd;
			ar>>sd.m_lDate;
			ar>>sd.m_lOpenPrice;
			ar>>sd.m_lMaxPrice;
			ar>>sd.m_lMinPrice;
			ar>>sd.m_lClosePrice;
			ar>>sd.m_lMoney;
			ar>>sd.m_lTotal;
			ar>>sd.def1;
			ar>>sd.def2;
			ar>>sd.def3;
			m_vecStockDay.push_back(sd);
		}
	}
}


vector <StockDay> m_vecStockDay;//類成員變量

//vector標准庫引用

#include<vector>
using namespace std;


//結構體類型
struct StockDay
{
unsigned long m_lDate; /*year-month-day ,example: 19960616
分鍾數據的表示方法如下:yymmddhhnn(年月日時分)
yy指的是year - 1990,故年份表達范圍:1990 - 2011
如0905131045,指的是:1999年5月13號10點45分。*/

long m_lOpenPrice; //開
long m_lMaxPrice; //高
long m_lMinPrice; //低
long m_lClosePrice; //收

long m_lMoney; //成交金額
unsigned long m_lTotal; //成交量 單位:百股(手)

long def1;
long def2;
long def3;

};

 

二、直接使用CFile讀取(常用)

直接讀取,可使用 CFileDialog 選擇讀取文件路徑

//結構體、m_vecStockDay 見方法一
//CString  strPathName:讀取文件的路徑
CFile file;
if (file.Open( strPathName, CFile::modeRead, NULL )) 
{
   int dataSize = sizeof(StockDay);  //結構體長度
   int fLenght = file.GetLength();  //文件長度
   int num = fLenght/dataSize;  //列表長度
   m_vecStockDay.resize(num); //為vector重新分配空間,具體理解見: http://www.cplusplus.com/reference/vector/vector/resize

  file.Read(m_vecStockDay.data(), fLenght);//vector.data()返回一個指針,該指針指向矢量內部用於存儲元素的內存數組。
    file.Close();

}

 

三、使用CFile打開文件,再使用CArchive序列化讀取

//strPathName 文件路徑
if (file.Open( strPathName, CFile::modeRead, NULL ))
{
    int dataSize = sizeof(StockDay);//結構體長度
    int fLenght =  file.GetLength();//文件長度
    int num = fLenght/dataSize;//列表長度
    
    CArchive ar(&file, CArchive::load);//
    int dataSize = sizeof(StockDay);//結構體長度
    int fLenght =  file.GetLength();//文件長度
    int num = fLenght/dataSize;//列表長度
    for(int i = 0; i<num; ++i)
    {
        StockDay sd;
        ar>>sd.m_lDate;
        ar>>sd.m_lOpenPrice;
        ar>>sd.m_lMaxPrice;
        ar>>sd.m_lMinPrice;
        ar>>sd.m_lClosePrice;
        ar>>sd.m_lMoney;
        ar>>sd.m_lTotal;
        ar>>sd.def1;
        ar>>sd.def2;
        ar>>sd.def3;
        m_vecStockDay.push_back(sd);
    }
}
ar.Close();
file.Close();        
}

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM