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文件的更多相关文章

  1. js方法实现rgb颜色转换成16进制格式的代码的方法

    原文地址:http://www.cnblogs.com/vaal-water/archive/2013/04/08/3008880.html 自己试过很好用 function zero_fill_he ...

  2. 【linux】16进制格式查看命令hexdump

    test.txt内容 asdfsg ewtwfsdf1Hello World! hexdump -Cv test.txt   输出 |asdfsg ewtwfsdf1| 6c 6c 6f 6f 6c ...

  3. ubuntu下以16进制形式查看class文件、反编译class文件

    参考:https://blog.csdn.net/xyh930929/article/details/83860464 1.vim HelloWorld.class 2.输入英文状态下的冒号:,然后输 ...

  4. 16进制与utf-8

    很多人将数据的存储.传输方式和展现形式混为一谈. 类似的16进制 2进制是讲内容在电脑里面的存储或者传输的一种格式, 而utf-8 gb2312 等是输出的展现的一种格式 不是一回事,另外 gbk包含 ...

  5. SQLSERVER 16进制转10进制

    原码.补码.反码参考: http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 进制转换参考: http://ww ...

  6. linux以16进制查看文件

    vim 先用vim -b data 以2进制打开文件,然后用xxd工具转化,在vim的命令行模式下: :%!xxd        --将当前文本转化为16进制格式 :%!xxd -r    --将16 ...

  7. [转载]Linux 16进制查看命令、工具

    转自:https://blog.csdn.net/chenglian_999/article/details/4672177 2009年10月14日 21:45:00 chenglian_999 阅读 ...

  8. shell给tcp或udp服务发送16进制报文指令

    指令:(sleep 2;echo "000F737D61747573" | xxd -r -p ;sleep 1)|nc 192.168.137.1 15000|hexdump - ...

  9. 解决nginx在记录post数据时 中文字符转成16进制的问题【转载】

    1. 问题描述 nginx 在获取post数据时候,如果是中文,则转换成16进制显示在日志文件中,如下图所示.   Paste_Image.png 日志格式为: log_format postdata ...

随机推荐

  1. 候选键(unique)

    foreign key references  除了关联外键,还可以关联 候选键(unique) 需求 table1 中的  status  int  类型 ,表示状态 ,0 未启动 ,1 已启动,2 ...

  2. 平安某金所奇葩的面经-关于幂等和ROA设计的反思

    在公司一直在做跟支付有关的项目,某日接到平安某金所一男子电话,应该是之前某猎头投的,我正好在吃早饭(也不能怪他们上班早,我们公司弹性工作制,我一般上班比较晚). 因为饭馆信号不好,只能赶紧放下剩下的半 ...

  3. Unofficial Microsoft SQL Server Driver for PHP (sqlsrv)非官方的PHP SQL Server 驱动

    原文 Unofficial Microsoft SQL Server Driver for PHP (sqlsrv) Here are unofficial modified builds of Mi ...

  4. Struts2和Struts1的主要区别(完整版)

    Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Act ...

  5. 使用AndroidStudio快速开发教程

    关于AndroidStudio的使用 参考:http://www.codes51.com/article/detail_98914.html  1.对于开发环境的通性:编写 调试 视图   一般的开发 ...

  6. OSG(OpenSceneGraphcow.osg)配置笔记

    OpenSceneGraph是一款高性能的3D图形开发库.广泛应用在可视化仿真.游戏.虚拟现实.高端技术研发以及建模等领域.使用标准的C++和OpenGL编写而成,可以运行在Windows系列.OSX ...

  7. 使用Excel快速发送大量的电子邮件

    使用Excel快速发送大量的电子邮件.两个步骤: 1. 准备发送数据: a.) 打开Excel,新Book1.xlsx b.) 填写以下内容. 第一列:接受者,第二列:邮件标题,第三列:文,第四列:附 ...

  8. Android Fragement学习笔记(三)----PreferenceFragment使用

    我相信每个人都Perference大家都比较熟悉,这就是我们常说的偏好,首选项设置,一些数据可以保存.例如,一些元件的,我们使用上次.希望下次启动后仍然生效,烦.一般这个时候我们便会使用perfere ...

  9. sql内置函数pivot强大的行转列功能

    原文:sql内置函数pivot强大的行转列功能 语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...

  10. Angularjs web应用

    构建兼容浏览器的Angularjs web应用 背景 随着mvvm逐渐成熟,现在使用jQuery构建web应用已经显得过时了,而且使用jQuery需要编写更多的代码去控制dom的取值.赋值.绑定事件等 ...