MFC中数据文件的存储和加载

1. 传统的数据存储,将数据定义到一个结构体中,用CFile的方式循环读写数据结构体

struct SData
{
    UINT nNumb;
    TCHAR sName[20];
    COleDateTime date;
};

void CfffDlg::OnBnClickedSave()
{
    //另存为对话框
    CFileDialog fd(FALSE, _T("*.fff"), _T("example"), OFN_OVERWRITEPROMPT, _T("信息文件(*.fff)|*.fff|所有文件|*.*||"), NULL);
    if (IDCANCEL == fd.DoModal())
        return;
    CFile file;
    if (!file.Open(fd.GetPathName(), CFile::modeCreate | CFile::modeWrite))
    {
        MessageBox(_T("保存文件出错!"), _T("Tip"));
        return;
    }
    SData s;
    for (int i = 0; i < m_list.GetItemCount(); ++i)
    {
        s.nNumb = _ttoi(m_list.GetItemText(i,0));
        m_list.GetItemText(i, 1, s.sName, sizeof(s.sName) / sizeof(s.sName[0]));
        s.date.ParseDateTime(m_list.GetItemText(i, 2));
        file.Write(&s, sizeof(s));
    }
}

void CfffDlg::OnBnClickedLoad()
{
    // TODO:  在此添加控件通知处理程序代码
    LPCTSTR szFilter = _T("信息文件(*.fff)|*.fff|所有文件|*.*||");
    //打开对话框
    CFileDialog fd(TRUE, _T("*.fff"), NULL, OFN_FILEMUSTEXIST, szFilter, NULL);
    if (IDCANCEL == fd.DoModal())
        return;
    CFile file;
    if (!file.Open(fd.GetPathName(), CFile::modeRead))
    {
        MessageBox(_T("打开文件失败!"));
        return;
    }
    SData s;
    CString str;
    m_list.DeleteAllItems();
    for (int i = 0; file.Read(&s, sizeof(s)) == sizeof(s); ++i)
    {
        str.Format(_T("%d"), s.nNumb);
        m_list.InsertItem(i, str);
        m_list.SetItemText(i, 1, s.sName);
        m_list.SetItemText(i, 2, s.date.Format(VAR_DATEVALUEONLY));
    }
}

2. 用CArchive类读写各种数据类型(它无基类,简单的封装CFile,大量重载了“operator<<”“operator>>”)

void CfffDlg::OnBnClickedSave()
{
    ////另存为对话框
    CFileDialog fd(FALSE, _T("*.fff"), _T("example"), OFN_OVERWRITEPROMPT, _T("信息文件(*.fff)|*.fff|所有文件|*.*||"), NULL);
    if (IDCANCEL == fd.DoModal())
        return;
    CFile file;
    if (!file.Open(fd.GetPathName(), CFile::modeCreate | CFile::modeWrite))
    {
        MessageBox(_T("保存文件出错!"), _T("Tip"));
        return;
    }
    //通过一个打开状态的文件,构造一个用于保存数据的归档对象
    CArchive ar(&file, CArchive::store);
    int i = 0, nCount = m_list.GetItemCount();
    ar << nCount;//先把信息总数(行)保存,以备提取数据
    while (i < nCount)
    {
        int nNumb = _ttoi(m_list.GetItemText(i, 0));
        CString szName = m_list.GetItemText(i, 1);
        COleDateTime time;
        time.ParseDateTime(m_list.GetItemText(i, 2));
        ar << nNumb << szName << time;//读取数据时严格按照此顺序
        ++i;
    }
}

void CfffDlg::OnBnClickedLoad()
{
    LPCTSTR szFilter = _T("信息文件(*.fff)|*.fff|所有文件|*.*||");
    //打开对话框
    CFileDialog fd(TRUE, _T("*.fff"), NULL, OFN_FILEMUSTEXIST, szFilter, NULL);
    if (IDCANCEL == fd.DoModal())
        return;
    CFile file;
    if (!file.Open(fd.GetPathName(), CFile::modeRead))
    {
        MessageBox(_T("打开文件失败!"));
        return;
    }
    CArchive ar(&file, CArchive::load);
    int nCount = 0;
    ar >> nCount;

    m_list.DeleteAllItems();
    int nNumb = 0;
    CString szName;
    COleDateTime time;
    CString str;
    int i = 0;
    while (i < nCount)
    {
        ar >> nNumb >> szName >> time;
        str.Format(_T("%d"), nNumb);
        m_list.InsertItem(i, str);
        m_list.SetItemText(i, 1, szName);
        str = time.Format(VAR_DATEVALUEONLY);
        m_list.SetItemText(i, 2, str);
        ++i;
    }
}

3. 用CDocument类序列化(Serialize)存储

新建一个mfc应用程序名为fff,新建一个MFC类 CDoc 继承 CDocument类,并在其虚函数Serialize()函数(是CObject的虚函数,所有CObject的派生类都有此函数)中修改

void CDoc::Serialize(CArchive& ar)
{
    AfxGetMainWnd()->Serialize(ar);
    //if (ar.IsStoring())
    //{
    //    // TODO:  在此添加存储代码
    //}
    //else
    //{
    //    // TODO:  在此添加加载代码
    //}
}

在CfffDlg类中添加成员变量,CDoc m_doc;
分别在加载函数和保存函数中添加代码,在CfffDlg类中添加虚函数 Serialize 函数

void CfffDlg::OnBnClickedSave()
{
    CFileDialog fd(FALSE, _T("*.fff"), _T("example"), OFN_OVERWRITEPROMPT, _T("信息文件(*.fff)|*.fff|所有文件|*.*||"), NULL);
    if (IDCANCEL == fd.DoModal())
        return;
    m_doc.OnSaveDocument(fd.GetPathName());
}

void CfffDlg::OnBnClickedLoad()
{
    LPCTSTR szFilter = _T("信息文件(*.fff)|*.fff|所有文件|*.*||");
    //打开对话框
    CFileDialog fd(TRUE, _T("*.fff"), NULL, OFN_FILEMUSTEXIST, szFilter, NULL);
    if (IDCANCEL == fd.DoModal())
        return;
    m_doc.OnOpenDocument(fd.GetPathName());
}

void CfffDlg::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {    // storing code
        int i = 0, nCount = m_list.GetItemCount();
        ar << nCount;//先把信息总数(行)保存,以备提取数据
        while (i < nCount)
        {
            int nNumb = _ttoi(m_list.GetItemText(i, 0));
            CString szName = m_list.GetItemText(i, 1);
            COleDateTime time;
            time.ParseDateTime(m_list.GetItemText(i, 2));
            ar << nNumb << szName << time;//读取数据时严格按照此顺序
            ++i;
        }
    }
    else
    {    // loading code
        int nCount = 0;
        ar >> nCount;
        m_list.DeleteAllItems();
        int nNumb = 0;
        CString szName;
        COleDateTime time;
        CString str;
        int i = 0;
        while (i < nCount)
        {
            ar >> nNumb >> szName >> time;
            str.Format(_T("%d"), nNumb);
            m_list.InsertItem(i, str);
            m_list.SetItemText(i, 1, szName);
            str = time.Format(VAR_DATEVALUEONLY);
            m_list.SetItemText(i, 2, str);
            ++i;
        }
    }
}

原文地址:https://www.cnblogs.com/htj10/p/11768150.html

时间: 2024-07-31 03:49:40

MFC中数据文件的存储和加载的相关文章

Android 文件的存储和加载

Android 文件的存储和加载,主要用于请求网络中json文件的缓存,引入了一个简单的过期时间,供大家参考学习! 文件存储 1 private void saveLocal(String json, int index) { 2 3 BufferedWriter bw = null; 4 try { 5 File dir=FileUtils.getCacheDir(); 6 //在第一行写一个过期时间 7 File file = new File(dir, getKey()+"_"

存储和加载本地文件(内部存储设备)

Android设备上的所有应用都有一个放置在沙盘中的文件目录,将文件保存到沙盒中可以阻止其他应用的访问. 沙盒目录的全路径为:/data/data/<包名>  用File Explorer查看: 如上图可见,每个应用都在/data/data下有一个以此应用包名命名的文件目录. 而本文就是介绍将文件保存在/data/data/<包名>/files/ 目录下 下面就展示如何在内部存储设备中存储和加载本地文件: 1.创建一个名为 DataStorage的工程 2.准备好布局文件(acti

Android存储和加载本地文件(外部存储设备)

有时候应用需要将数据写入到设备的外部存储上.列如,需要同其他应用或用户共享音乐.图片或者网络下载资料时,保存在外部设备的数据共享起来要比较方便.而且,外部设备通常具有更大的存储空间. 我们可以通过android.os.Environment.getExternalStorageDirectory()方法获取sdCard的路径.再在此路径下创建一个MyFiles的文件,将数据保存在MyFiles文件夹下. 下面就展示如何在外部存储设备中存储和加载本地文件: 1.创建一个名为 DataStorage

MFC中浏览文件和浏览目录的实现[转]

1. 浏览文件 1 void CDlgCompare::OnBnClickedBtnSel() 2 { 3 // TODO: Add your control notification handler code here 4 UpdateData(TRUE); 5 CFileDialog fileDlg(TRUE); 6 fileDlg.m_ofn.lpstrTitle="文件打开对话框"; 7 fileDlg.m_ofn.lpstrFilter="All Files(*.*

ARM指令集中常用的存储和加载指令

ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作.常用的加载存储指令如下: -  LDR     字数据加载指令 -       LDRB    字节数据加载指令 -  LDRH    半字数据加载指令 -  STR     字数据存储指令 -       STRB    字节数据存储指令 -  STRH    半字数据存储指令 1.LDR指令 LDR指令的格式为: LDR{条件} 目的寄存器,<存储器地址>

用JavaScript实现js文件的版本管理和加载

受<大公司怎样开发和部署前端代码?>这篇文章的启发,结合自己的项目实践,创建了一套JavaScript文件的版本管理和加载的机制,虽然比较粗糙,但是解决了不少实际的问题. 使用到的主要工具: Node.js NPM grunt和相关插件(grunt-hashmap,grunt-contrib-uglify,自定义的插件) LAB.js 功能能点: 利用grunt插件hashmap根据JavaScript的文件的内容生成hash码,可做为JavaScript文件名的一部分,有效防止在更改Java

Android数据库中数据文件的导出与查看

当Android开发过程中涉及到数据库的操作,我们通常需要将App的数据库文件(即*.db文件)导出查看,以验证对数据库的增删改查是否正确. 由于真机在没有root的情况下,没有权限访问受保护的数据存储区域,所以为了简单起见,可以选择在模拟器上进行数据文件的导出工作.本文用来验证 一个ContentProvider示例是否成功的进行了数据库插入操作,开发工具为Eclipse ADT(Android API 18),详细的步骤如下:  (1)首先New一个模拟器,具体步骤如下图所示(红框标出操作选

etl数据提取、转换和加载

ETL负责将分散的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为联机分析处理.数据挖掘的基础. ETL一词较常出现在数据仓库,但其对象并不局限于数据仓库. ETL是数据仓库中的非常重要的一环.它是承前启后的必要的一步.相对于关系数据库,数据仓库技术没有严格的数学理论基础,它更面向实际工程应用.所以从工程应用的角度来考虑,按着物理数据模型的要求加载数据并对数据进行一些系列处理,处理过程与经验直接相关,同时这部分的工作直接关

Exchange Server 中数据文件的移植

案例场景: 公司有一个Exchange Server(08Server1), 出现了故障,计算机无法启动,在服务器中有一个数据DB_HR.edb,  使用WinPE吧此数据文件拷贝出来.然后重新在服务器(08Server2)上安装好了Exchange Server 需求:如何把DB_HR.edb挂载到新的Exchange Server上继续提供服务器,而且原先用户的所有邮件能够继续被访问,确保所有的邮件都不能丢失. 一 .Exchange Server 2007的操作方法 1.重新创建存储组SG