一,使用CFileDialog文件对话框

对话框仅仅是为了获得将要打开文件或保存文件的名称和路径,当然还会有文件的后缀过滤器。代码如下:

 /*打开文件对话框*/CString filter;//MFC的字符串类filter = "文本文档(*.txt)|*.txt||";//文件名称过滤器CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter);//设置为TRUE为打开文件对话框if (dlg.DoModal() == IDOK)//判断是否成功点击确定{CString strPath;//文件路径strPath = dlg.GetPathName();//获取文件路径//TODO 根据文件路径strPath你可以读取数据</span>MessageBox(strPath);}

保存文件对话框,只需要秀修改CFileDialog的构造方法的第一个参数为FALSE就行了。

二,使用CArchive和CFile对文件进行读写操作

CArchive类是对文件操作的工具类,它很方便的实现了CFile的很多功能,代码如下:

 /*读取文件*/CString filter;filter = "文本文档(*.txt)|*.txt||";//文件名称过滤器CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter);//设置为TRUE为打开文件对话框if (dlg.DoModal() == IDOK)//判断是否成功点击确定{CString strPath;//文件路径strPath = dlg.GetPathName();//获取文件路径//todo 将本地文件载入内存CFile mFile;if (mFile.Open(strPath, CFile::modeRead) == 0)//已read方式打开文件return;char buf[512];//缓冲为512,我要保存的类很小,也很少CArchive ar(&mFile, CArchive::load, 512, buf);//创建CArchive,模式为load就是read//ar >> str_txt;//二进制读取,如果是文本,读取会出问题,第一个字符会乱码,有时候还会文件指针越界ar.ReadString(str_txt);//读取数据并保存到str_txt数组中//ar.Flush();//清理缓冲区,写入本地ar.Close();mFile.Close();MessageBox(strPath);//弹出文件路径}}
</pre><pre>
 /*保存文件*/CString filter;filter = "文本文档(*.txt)|*.txt||";CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY, filter);if (dlg.DoModal() == IDOK){CString strPath;strPath = dlg.GetPathName();//todo 将内存中的文件保存到本地CFile mFile;mFile.Open(strPath, CFile::modeCreate | CFile::modeWrite);CArchive ar(&mFile, CArchive::store);//类似write//ar << str_txt;//二进制读写ar.WriteString(str_txt);//字符串读写ar.Close();mFile.Close();MessageBox(strPath);}

三,使用CStdioFile实现简单字符串文件操作

如果你要操作的文件知识文本字符串,并且文件不大,使用CStdioFile将更加方便,代码如下:

 /*读取文件*/CString filter;filter = "文本文档(*.txt)|*.txt||";CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter);if (dlg.DoModal() == IDOK){CString strPath;strPath = dlg.GetPathName();CStdioFile mFile;//简单文本文件的读写CFileException mExcept;//文件异常,我没有使用mFile.Open(strPath, CFile::modeRead);if (mFile == NULL)return;mFile.ReadString(str_txt);mFile.Close();MessageBox(strPath);}
<strong>   </strong>/*保存文件*/CString filter;filter = "文本文档(*.txt)|*.txt||";CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY, filter);if (dlg.DoModal() == IDOK){CString strPath;strPath = dlg.GetPathName();CStdioFile mFile;CFileException mExcept;mFile.Open(strPath, CFile::modeWrite, &mExcept);CString string = L"I am a string by append";mFile.SeekToEnd();//可以跳到文件末尾,而CArchive没有这个功能//mFile.SeekToBegin();//可以跳到文件开头,而CArchive没有这个功能mFile.WriteString(string);mFile.Close();MessageBox(strPath);}

四,使用CArchive和CObject.Serialize()实现对象序列化和反序列化

主要包括两部分,可序列化类的声明,类的本地保存和读取(序列化和反序列化)。

1,声明可序列化类,分为.h文件和.cpp文件,代码如下:

#pragma once
class Student:public CObject //第一步 继承CObject类
{
public:DECLARE_SERIAL(Student); //第二部 使用宏声明当前创建类是序列化类Student();~Student();virtual void Serialize(CArchive& archive); //第三部 重写序列化方法CString name;char sex;unsigned int age;
};
#include "stdafx.h"
#include "Student.h"IMPLEMENT_SERIAL(Student, CObject, 1)//第四步 建立版本标识,类似于ID,多个不同的类序列化时,数字不要重复
Student::Student()
{
}Student::~Student()
{
}void Student::Serialize(CArchive& archive)//第五步 实现序列化方法
{CObject::Serialize(archive);if (archive.IsStoring())//判断是否是写到文件即序列化archive << name << sex << age;//将属性保存到文件elsearchive >> name >> sex >> age;//将属性读取到程序
}

2, 类的本地保存和读取( 序列化和反序列化 ),代码如下:

 /*读取文件到程序*/CString filter;filter = "文本文档(*.txt)|*.txt||";CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter);if (dlg.DoModal() == IDOK){CString strPath;strPath = dlg.GetPathName();//todo 将本地文件载入内存CFile mFile;if (mFile.Open(strPath, CFile::modeRead) == 0)return;char buf[512];CArchive ar(&mFile, CArchive::load, 512, buf);unsigned long length = ar.ReadCount();//读取存储的数据单元个数,因为我们是首先写的,所以必须首先读Student* stu;for (int i = 0; i < length;i++)stu = (Student*)ar.ReadObject(RUNTIME_CLASS(Student));//读取一个类信息,同时指针移动到下一个类信息开始,我们读取最后一个ar.Close();mFile.Close();MessageBox(strPath);}
 /*保存对象到文件中*/CString filter;filter = "文本文档(*.txt)|*.txt||";CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY, filter);if (dlg.DoModal() == IDOK){CString strPath;strPath = dlg.GetPathName();//todo 将本地文件载入内存CFile mFile;if (mFile.Open(strPath, CFile::modeCreate|CFile::modeWrite) == 0)//文件的打开模式中间使用的|一个竖杠return;char buf[512];CArchive ar(&mFile, CArchive::store, 512, buf);Student stu;stu.age = 99;stu.name = L"徐凯文";stu.sex = 'm';ar.WriteCount(1);//首先写入我们将要写入的数据单元个数,便于读取的时候,判断个数ar.WriteObject(&stu);//写入文件ar.Close();mFile.Close();MessageBox(strPath);}

MFC文件的读写操作,类的序列化与反序列化,CFile,CFileDialog,CArchive,CStdioFile相关推荐

  1. java 二进制 文件比较_Java中对文件的读写操作之比较

    Java 中对文件的读写操作之比较 作者:Jeru Liu 日期:November 29,2000 版本:1.0 纪念在chinaasp积分过一百呕心原创一篇(Java 中对文件的读写操作之比较)拿分 ...

  2. c语言读取ascii文件,C++对ASCII文件的读写操作

    如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件).程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符. 对ASCI ...

  3. 第五天2017/04/06(上午:文件的“读写操作”)

    文件的"读"."写"的理解不是站在"程序"的角度,而是站在"文件"的角度读:从文件中读取数据,输出到程序中写:从程序中读 ...

  4. python3 读取文本文件_python3文件的读写操作

    open函数:对文件进行读写操作前,先打开文件,获取文件的句柄: open(file, mode, encoding, buffering) 参数说明 file_name:一个包含了你要访问的文件路径 ...

  5. 史上最完整的文件和目录操作类

    [文件操作类]史上最完整的文件和目录操作类 <a target=_blank href="http://bbs.cskin.net/thread-114-1-1.html"& ...

  6. Python小练习1:.txt文件常用读写操作

    .txt文件常用读写操作 本文通过一个实例来介绍读写txt文件的各种常用操作,问题修改自coursera上南京大学的课程:用Python玩转数据. 直接进入正题,考虑下面为练习读写txt文件的各种操作 ...

  7. python文件下载速度 装饰器_python使用装饰器对文件进行读写操作'及遍历文件目录...

    '''使用装饰器对文件进行读写操作''' #def check_permission(func):#'''演示嵌套函数定义及使用'''#def wrapper(*args,**kwargs):#''' ...

  8. 文件的读写操作 c# 1614992256

    文件的读写操作 c# 1614992256 读操作 写操作

  9. AndroidStudio_android中实现对properties文件的读写操作_不把properties文件放在assets文件夹中_支持读写---Android原生开发工作笔记238

    这个东西还挺麻烦,因为是android中,我们一般把文件放到assets文件夹中去,但是实际上,这个raw文件夹和assets文件夹 是只读的,对,就是只读的只能读取,不能写入,所以一定要把文件写入到 ...

  10. Java 使用 POI 对 Excel文件 进行读写操作

    Java 使用 POI 对 Excel文件 进行读写操作 一.背景 目前正在做一个问卷功能模块,收集完问卷信息后,需要将数据库中的数据导出到Excel数据表中进行留存,因此就学习了在Java中如何对E ...

最新文章

  1. shell part2
  2. java 工程ssl配置_JAVA_SSL配置
  3. windows10使用VMvare Pro开启虚拟机提示与Device/Credential Guard不兼容
  4. srpm包的编译方式
  5. 转 天才学生的天才回答
  6. IOS拍照控件同时显示拍照与录像
  7. mysql使用mybatis删除不生效_解决myBatis中删除条件的拼接问题
  8. 【Redis总结-基础入门】
  9. 总结几个有关国家行政区划的问题
  10. 【用EXCEL编写俄罗斯方块小游戏(基于VBA)】
  11. 使用phpStudy显示3306端口被占用,该怎么办?
  12. 计算机二级考风考纪主题班会,2021年我国计算机二级考试基础概述.doc
  13. 荀子《劝学》原文及翻译
  14. 本地局域网内添加DNS解析的方法
  15. 这几种水果皮赛过良药
  16. Linux软件raid删除
  17. 数据结构字符串模式匹配中计算next和nextval的值(C语言)
  18. 基础薄弱考生考研英语初期复习方法推荐
  19. 基于STM32水温炉温温度控制系统电路设计-分享
  20. Python学习第一天~Python优点、运行、变量类型及存储、对象类型、数据类型

热门文章

  1. 让wordpress判断是电脑端浏览还是移动端浏览
  2. MAC编译lame ld: symbol(s) not found for architecture x86_64/_lame_init_old“, referenced from
  3. 字写得难看,是什么原因
  4. RSA加密:javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
  5. 下载并安装mercurial/hg
  6. 有N个软件包未被升级
  7. 4站地铁50多分钟,百度地图怎么算的
  8. 做手机系统,鸿蒙怎样才有机会
  9. 同样一句代码,在类内调用,跟类外调用结果不同?
  10. php简化URL路径,thinkphp框架实现路由重定义简化url访问地址的方法分析