MFC二进制文件读取

1、mfc Document-vew doc类中读取

doc类中读取,在Vew类中可直接使用。

在菜单栏NewFile/OpenFile 后,系统自动调用Serialize()函数

if :写入文件

else:读取文件

eg:读取二进制文件(结构体数据)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// 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;//类成员变量//结构体、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();
 
}//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();       
}

//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 选择读取文件路径

复制代码
复制代码

 

三、使用CFile打开文件,再使用CArchive序列化读取

复制代码
复制代码

 

  

posted @   燕钰达  阅读(1558)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示