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序列化读取
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了