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(); }