CFileDialog类与16进制格式的dat文件
CFileDialog类与16进制格式的dat文件
要将数据保存为.dat文件,而且是16进制的数字,怎么保存?
要读取.dat文件,文件是16进制的,怎么读取?
用CFileDialog类可以得到【保存】和【打开】的对话框,具体怎么保存和读取,需要我们自己写代码了。这里,和大家分享一下,怎么保存16进制的文件到.dat中?怎样从.dat中读取你保存的16进制数字?
对于读取到的这些数据,你想做什么,可以因人而异。您可以在看懂本篇文章的基础上,举一反三。
本人也是菜鸟,也是参考了很多论坛上高手的代码。代码虽然能通过编译,可能不是最好的。欢迎大家提出意见。
一、保存16进制数字的.dat文件:

1 // 文件的保存
2 // 通过CFileDialog 类,保存文件
3 CFileDialog fileDlg(FALSE, "dat", "btypetb");
4 fileDlg.m_ofn.lpstrTitle="请保持设置";
5 fileDlg.m_ofn.lpstrFilter=".dat files(*.dat)\0*.dat";
6
7 // 获得相对路径(网上找的的这个方法)
8 // 先获取当前正在运行的程序的路径,然后将该路径拿来自己用 。
9 TCHAR szFilePath[MAX_PATH + 1];
10 GetModuleFileName(NULL, szFilePath, MAX_PATH);
11 (_tcsrchr(szFilePath, _T('\\')))[1] = 0;
12 CString strtemp = szFilePath;
13 fileDlg.m_ofn.lpstrInitialDir = strtemp;
14
15 // 定义fpFile文件指针
16 FILE *fpFile;
17
18 // 如果用户点击了保存按钮,则执行if语句内的操作
19 if (IDOK == fileDlg.DoModal())
20 {
21 // 获取用户输入的文件名。有2种方法
22 CString fileName = fileDlg.GetFileName();
23 // CString fileName = fileDlg.m_ofn.lpstrFileTitle;
24
25 // fopen的第一个参数是带路径的文件名。
26 if ((fpFile = fopen(strtemp+"\\"+fileName, "w+b")) == NULL)
27 return ;
28 fwrite (datBuffer, 2 + m_DevCounts * 2, 1, fpFile);
29 fclose(fpFile);
30 }

虽然代码里面有注释,我这里还是再解释一部分代码:
1.代码第3行,第一个参数false,表示我们需要一个【保存】的对话框。如果传递true,那么你将得到【打开】的对话框。第二个参数是保存文件默认的文件格式,这里是dat格式。第三个参数比较重要了,是你默认的文件名。参数传递的个数,不是固定的,你可以传入1个参数,也可以传入多个参数,根据个人需要而定。更多解释,您可以参考MSDN。
2.代码第5行,这是设置格式过滤器。我也是参考孙鑫的《VC++深入详解》第12章中提到的文件过滤器来做的。下面的代码是教程中的代码,您可以自己手动设置几次,弄懂之后,修改为自己需要的就可以了。


3.代码第7行到第13行,是参考了网上一位高手的回帖。
4.注意第26行代码里面的参数。这里是设置为二进制的写。您可以参考MSDN了解跟多信息。
5.看第28行代码。这是我们的重点。文件操作3部曲:1.打开文件;2.Write/Read文件;3.关闭文件。
第28行代码中,第一个参数,是保存了这些16进制数字的数组,第2个参数,是数组的大小(为什么我的第二个参数是这样样子的,您就不必纠结了。这是我程序中的实际传递过来的参数。您可以根据实际情况来决定您的数组大小。);其他参数,参考MSDN。
datBuffer是这样定义的:BYTE datBuffer[200]; // 数组长度根据您个人实际来设置。
BYTE 是 unsigned char 类型 // 在你进行类型转换的时候,会很有用
为什么定义为BYTE就是能保存16进制数字了,其实我也不太清楚。
我也是在网上参考高手的代码,才实现上述功能的。刚才在网上又搜了一下,这里有个将BYTE和16进制之间的关系的文章,可以看看。
http://www.360doc.com/content/11/0222/22/4780948_95250828.shtml
回到文章中来,我们就这么一 Write,就能成功生成16进制的.dat文件了。哈哈,是不是感觉特厉害。。。。。。
在成功的同时,我们也应该知道,其实还是有一些知识点没有消化。。。欢迎高手指点。
补充一点:
.dat存储的时候,是以BYTE来存储的。说得通俗点,就是unsigned char 类型来存储的。
而我的原始数据是int类型。。。将int转为16进制的BYTE。这里,不需要用到什么函数。
直接,强制类型转换。即可。不需要想太多、太复杂。

int a1=10, a2=192;
BYTE arr[4] = {0};
arr[0] = (unsigned char)a1;
arr[1] = (unsigned char)a2;
arr[2] = 0xaa;

//上面的赋值代码都是合法的。
// 这样做就很好了。还需要啥函数来转换。。
// 活学活用啊。。。我当时钻牛角尖了。
二、读取16进制数字的.dat文件:

1 CFileDialog fileDlg(TRUE);
2 fileDlg.m_ofn.lpstrTitle="打开我的dat文件";
3 fileDlg.m_ofn.lpstrFilter=".dat files(*.dat)\0*.dat";
4
5 // 获得相对路径(网上找的的这个方法)
6 // 先获取当前正在运行的程序的路径,然后将该路径拿来自己用 。
7 TCHAR szFilePath[MAX_PATH + 1];
8 GetModuleFileName(NULL, szFilePath, MAX_PATH);
9 (_tcsrchr(szFilePath, _T('\\')))[1] = 0;
10 CString strtemp = szFilePath;
11 fileDlg.m_ofn.lpstrInitialDir = strtemp;
12
13 // 定义fpFile文件指针
14 FILE *fpFile;
15
16 if (IDOK == fileDlg.DoModal())
17 {
18 long Filelen;
19 // 注意细节
20 unsigned char* buffer;
21
22 CString fileName = fileDlg.GetPathName();
23
24 if ((fpFile = fopen(fileName, "rb")) == NULL)
25 return ;
26
27 // 文件指针到文件尾
28 fseek(fpFile, 0, SEEK_END);
29 // 读取文件长度
30 Filelen = ftell(fpFile);
31 // 分配内存
32 // 按文件长度申请内存空间
33 buffer = (unsigned char*)malloc(Filelen);
34
35 // 文件指针指到文件头
36 fseek(fpFile, 0, SEEK_SET);
37 // 读取文件到申请的内存
38 fread(buffer, 1, Filelen, fpFile);
39 fclose(fpFile);
40
41 // 到这里,其实buffer里面已经存放了你需要的数据,你可以做你需要的操作了。
42 // 这里,将读取的16进制数字,在MessageBox中显示出来。
43 CString strResult;
44 for(int j=0; j<Filelen; j++)
45 {
46 CString s = "";
47 s.Format("%2.2x ", buffer[j]);
48 strResult += s;
49 }
50
51 MessageBox(strResult);
52 }

1.代码第1行,这里传递的参数是TRUE。表示,我们需要一个【打开】的对话框。
2.代码第20行,我们定义的是 unsgined char* 类型的变量。
3.从代码第28行开始,是重点了。
4.在代码第24行中,设置了为二进制打开。
5.第38行代码,将数据读入到buffer中了。到此,你已经得到你想要的16进制数字了。你想怎么处理,可以根据实际情况来实际操作。这里再说一次,buffer定义的是unsigned char*类型,在进行强制类型转换的时候,会有用的。
6.在这里,我们想将.dat文件里的16进制数字在MessageBox对话框中显示出来,我们可以看第44行的代码。
补充:
如果你想将这些16进制数字显示出来的话,第41行到第51行的代码可以实现此功能。
如果你想将读取的16进制数字用作其他用途,个人是这么理解的。
通过第38行的代码,你的buffer数组中,已经存放了16进制的数字了。
16进制数字对我来说,没多大用。(至少我当前程序中没有涉及到这方面的问题)
我当时是这么做的,将16进制的数字转换为整型的数字。整型是大家都熟悉的类型,然后你就可以想干什么就干什么了。
(如果您在数值直接的转换方面遇到了一些问题,个人建议还是多看看这些类型的定义(一般,C++基础教程里面都会讲到的,温故而知新)。比如BYTE其实是unsigned char类型,char和int之间是可以相互转换的,但是要注意char的范围,也要知道,unsgined char 和 char 作用的范围不同,小心数据丢失哦。)

int Num1, Num2;
Num1 = buffer[0];
Num2 = buffer[1];

总结:感谢,感谢网上各位高手。
这里是几个值得参考的帖子:
http://bbs.csdn.net/topics/300048398
http://bbs.csdn.net/topics/320263449
CFileDialog类与16进制格式的dat文件的更多相关文章
- js方法实现rgb颜色转换成16进制格式的代码的方法
原文地址:http://www.cnblogs.com/vaal-water/archive/2013/04/08/3008880.html 自己试过很好用 function zero_fill_he ...
- 【linux】16进制格式查看命令hexdump
test.txt内容 asdfsg ewtwfsdf1Hello World! hexdump -Cv test.txt 输出 |asdfsg ewtwfsdf1| 6c 6c 6f 6f 6c ...
- ubuntu下以16进制形式查看class文件、反编译class文件
参考:https://blog.csdn.net/xyh930929/article/details/83860464 1.vim HelloWorld.class 2.输入英文状态下的冒号:,然后输 ...
- 16进制与utf-8
很多人将数据的存储.传输方式和展现形式混为一谈. 类似的16进制 2进制是讲内容在电脑里面的存储或者传输的一种格式, 而utf-8 gb2312 等是输出的展现的一种格式 不是一回事,另外 gbk包含 ...
- SQLSERVER 16进制转10进制
原码.补码.反码参考: http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 进制转换参考: http://ww ...
- linux以16进制查看文件
vim 先用vim -b data 以2进制打开文件,然后用xxd工具转化,在vim的命令行模式下: :%!xxd --将当前文本转化为16进制格式 :%!xxd -r --将16 ...
- [转载]Linux 16进制查看命令、工具
转自:https://blog.csdn.net/chenglian_999/article/details/4672177 2009年10月14日 21:45:00 chenglian_999 阅读 ...
- shell给tcp或udp服务发送16进制报文指令
指令:(sleep 2;echo "000F737D61747573" | xxd -r -p ;sleep 1)|nc 192.168.137.1 15000|hexdump - ...
- 解决nginx在记录post数据时 中文字符转成16进制的问题【转载】
1. 问题描述 nginx 在获取post数据时候,如果是中文,则转换成16进制显示在日志文件中,如下图所示. Paste_Image.png 日志格式为: log_format postdata ...
随机推荐
- 有意思的cmd命令
1. Msconfig命令显示系统配置窗体,能够了解一些服务.启动相关的信息. 2.Gpedit.msc 命令显示本地组策略编辑器,能够设置用户登录时执行的程序. 3. Regedit 这个应该非常多 ...
- MVC使用百度开源文本编辑器UEditor实现图文并茂,字数限制,上传图片或涂鸦
原文:MVC使用百度开源文本编辑器UEditor实现图文并茂,字数限制,上传图片或涂鸦 文本编辑器有很多,比如ticymce和CKEditor就比较好用,但涉及到图片.文件上传,需要结合CKFinde ...
- Android KeyStore Stack Buffer Overflow (CVE-2014-3100)
/* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰 邮箱: minzhenfei@163.com */ 1. KeyStore Service 在Android中,/system/bi ...
- 退出手机QQ依旧显示在线
老婆说明明看到你手机QQ在线,怎么发信息不回复?这让我非常是冤枉,我明明退出了啊! 晚上宝宝睡觉后,我们一起来研究,发现了当中的秘密,原来仅仅要选择了"退出后仍接受消息通知"这个选 ...
- jQuery多文件
jQuery多文件下载 文件下载是一个Web中非常常用的功能,不过你是做内部管理系统还是做面向公众的互联网公司都会遇到这个问题,对于下载一般有点实际开发经验的都会自己解决,上周弄了一下多文件下载,业务 ...
- ASPX的Timer位置没放正确,导致整页刷新,而不是UpdatePanel里的内容刷新。
提示:Timer应该放在UpdatePanel的ContentTemplate标签里,才行.放在外面的话,会导致整页刷新.
- CSS学习笔记:Media Queries
CSS3提供了Media Queries(媒体查询)的概念,可以利用它查询以下数据: 1.浏览器窗口的宽和高: 2.设备的宽和高: 3.设备的手持方向,横向/竖向: 4.分辨率. @media规则的语 ...
- C# 编译器选项 /platform(指定输出平台)32位程序运行到x64平台的问题
如果说你编译的exe运行时报错: “尝试读取或写入受保护的内存.这通常指示其他内存已损坏” 这很有可能是你是以非托管的方式错误地引用了64位的API中去. 为什么会这样? 那你就要考虑VS的编译器选项 ...
- MVC无刷新分页
MVC无刷新分页(即局部刷新,带搜索,页数选择,排序功能) 我查看了很多网站,大部分评论分页都是局部刷新的,可大部分电商商品展示分页都是有刷新页面的,于是我便做了一个商品展示无刷新分页的例子.接下 ...
- IE通过推理IE陈述的版本号
样例: 1. <!--[if !IE]> 除IE外都可识别 <![endif]--> 2. <!--[if IE]> 全部的IE可识别 <![endif]-- ...